31

多くのカスタムPythonモジュールを格納する信頼できるリモートサーバーがあります。HTTP経由で(たとえば、を使用してurllib2.urlopen)text / plainとしてフェッチできますが、フェッチしたモジュールコードをローカルハードディスクに保存できません。グローバル変数とインポートを含め、完全に操作可能なPythonモジュールとしてコードをインポートするにはどうすればよいですか?
モジュールの機能のいくつかの組み合わせを使用する必要があると思いますがexecimpまだそれを機能させることができませんでした。

4

4 に答える 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 に答える