2

に追加せずに(可能であれば、任意のファイル拡張子を使用して、またはメモリ、ソース、またはバイナリから)Python コードをロードしたいと考えていますsys.modules。を使用しimp.load_sourceてファイルをロードすることはできますが、返されたモジュールはsys.modules既存のモジュールに追加され、結合されることさえあります (この質問を参照してください)!

だから、私が現在やっていることは、__import__()ビルトインを使用することです。パッケージからインポートすることはできますが、任意のファイルをロードすることはできません。

try:
    m = __import__(name)
    for n in name.split('.')[1:]:
        m = getattr(m, n)
    return m
except:
    raise
finally:
    # Restore the old module configuration. Only modules that have
    # not been in sys.path before will be removed.
    for k, v in sys.modules.items():
        if k not in prev_modules and self.is_local(v) or not v:
            del sys.modules[k]
        else:
            sys.modules[k] = v
  1. インポート前に含まれていなかったすべてのモジュールを削除することは、私にとって非常にハックなアプローチです。
  2. その名前のモジュールが既に存在する場合、再ロードされません。
  3. 任意のファイルをロードすることも、メモリからロードすることもできません。

execセキュリティ上の理由から、ステートメントを避けようとしています。によって評価されたソースはexec、使用してアプリケーションにハッキングするsys._getframe()可能性があります (さらに多くの可能性があります)。私はdjangoloadタグの実装を見てきましたが、それ__import_()も同様に使用されています.

安全で自己完結型のファイル (またはメモリ) から Python コード (ソースまたはバイナリ) をロードする方法はありますsys.modulesか? 最良の場合、ファイルをメモリからロードできるだけでなく、関数のような完全なパッケージをロードすることもできます__import__()

4

1 に答える 1

1

CPython インタープリターを使用すると、これが可能になるとは思えません。ただし、PyPy はサンドボックス化された環境を提供し、やりたいことを非常に簡単にします。

詳細については、サンドボックス化に関する PyPy のドキュメントを参照してください。

于 2013-03-18T13:31:28.003 に答える