に追加せずに(可能であれば、任意のファイル拡張子を使用して、またはメモリ、ソース、またはバイナリから)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
- インポート前に含まれていなかったすべてのモジュールを削除することは、私にとって非常にハックなアプローチです。
- その名前のモジュールが既に存在する場合、再ロードされません。
- 任意のファイルをロードすることも、メモリからロードすることもできません。
exec
セキュリティ上の理由から、ステートメントを避けようとしています。によって評価されたソースはexec
、使用してアプリケーションにハッキングするsys._getframe()
可能性があります (さらに多くの可能性があります)。私はdjangoload
タグの実装を見てきましたが、それ__import_()
も同様に使用されています.
安全で自己完結型のファイル (またはメモリ) から Python コード (ソースまたはバイナリ) をロードする方法はありますsys.modules
か? 最良の場合、ファイルをメモリからロードできるだけでなく、関数のような完全なパッケージをロードすることもできます__import__()
。