多くのカスタムPythonモジュールを格納する信頼できるリモートサーバーがあります。HTTP経由で(たとえば、を使用してurllib2.urlopen
)text / plainとしてフェッチできますが、フェッチしたモジュールコードをローカルハードディスクに保存できません。グローバル変数とインポートを含め、完全に操作可能なPythonモジュールとしてコードをインポートするにはどうすればよいですか?
モジュールの機能のいくつかの組み合わせを使用する必要があると思いますがexec
、imp
まだそれを機能させることができませんでした。
質問する
8919 次
4 に答える
48
これでうまくいくようです:動的に生成されたモジュールをインポートする
>>>インポートインプ >>> foo = imp.new_module( "foo") >>> foo_code = "" " ...クラスFoo: ... パス ... "" " >>> exec foo_code in foo .__ dict__ >>> foo.Foo .__ module__ 'foo' >>>
また、ActiveStateの記事で提案されているように、新しいモジュールを次の場所に追加することをお勧めしますsys.modules
。
>>> import sys >>> sys.modules ["foo"] = foo >>> fooimportFooから <クラス'Foo'…> >>>
于 2010-09-26T20:13:35.690 に答える
5
これは私がしばらく前にブックマークしたもので、似たようなものをカバーしています:
それはあなたが望むものを少し超えていますが、基本的な考え方はそこにあります。
于 2010-09-26T20:15:58.553 に答える
0
Python3バージョン
(他の回答を編集しようとしましたが、編集キューがいっぱいです)
import imp
my_dynamic_module = imp.new_module("my_dynamic_module")
exec("""
class Foo:
pass
""", my_dynamic_module.__dict__)
Foo = my_dynamic_module.Foo
foo_object = Foo()
# register it on sys
import sys
sys.modules[my_dynamic_module.__name__] = my_dynamic_module
于 2021-04-18T19:49:28.463 に答える
0
最近、プロジェクトのreadmeに挿入したソースコード例の単体テストを作成しようとしているときに、これを実行しようとしていることに遭遇しました(小さなファイルにリンクしたり、同期がとれない方法でテキストを複製したりすることは避けたかったのです)。
私は次のことを思いついた
import sys
import types
from importlib import import_module
def compile_and_install_module(module_name: str, source_code: str) -> types.ModuleType:
"""Compile source code and install it as a module.
End result is that `import <module_name>` and `from <module_name> import ...` should work.
"""
module = types.ModuleType(module_name, "Module created from source code")
# Execute source in context of empty/fake module
exec(source_code, module.__dict__)
# Insert fake module into sys.modules. It's now a real module
sys.modules[module_name] = module
# Imports should work now
return import_module(module_name)
そして、それをどのように使用できるかの簡単な例
$ cat hello.py
def foo():
print("Hello world")
bar = 42
$ python
Python 3.9.5 (tags/v3.9.5:0a7dcbd, May 3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from compile import compile_and_install_module
>>> compile_and_install_module("hello", open("hello.py").read())
<module 'hello'>
>>> import hello
>>> hello.foo()
Hello world
>>> from hello import bar
>>> bar
42
次の場合は、戻り値とimport_libインポートを削除できます。
于 2021-08-15T04:41:23.273 に答える