15

モジュールのコード オブジェクトがある場合、対応するモジュール オブジェクトを取得するにはどうすればよいですか?

私がmoduleNames = {}; exec code in moduleNames望むものに非常に近いことをしているようです。モジュールで宣言されたグローバルを辞書に返します。しかし、実際のモジュール オブジェクトが必要な場合は、どうすれば取得できますか?

編集: 独自のモジュール オブジェクトをロールできるようです。モジュールタイプは便利に文書化されていませんが、次のようなことができます:

import sys
module = sys.__class__
del sys
foo = module('foo', 'Doc string')
foo.__file__ = 'foo.pyc'
exec code in foo.__dict__
4

1 に答える 1

25

コメントがすでに示しているように、今日の Python では、組み込みの名前を持たない型をインスタンス化するための推奨される方法は、標準ライブラリのtypesモジュールを介して取得した型を呼び出すことです。

>>> import types
>>> m = types.ModuleType('m', 'The m module')

これは新しいモジュールを に自動的に挿入しないことに注意してくださいsys.modules:

>>> import sys
>>> sys.modules['m']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'm'

これは、手動で実行する必要があるタスクです。

>>> sys.modules['m'] = m
>>> sys.modules['m']
<module 'm' (built-in)>

モジュールのコード オブジェクトは通常、モジュールが に追加されたsys.modulesに実行されるため、これは重要なsys.modules[__name__]場合がありKeyErrorます。 このステップのm.__file__、編集で既に行っているように設定します。

>>> code = compile("a=23", "m.py", "exec")
>>> exec code in m.__dict__
>>> m.a
23

(または Python 3execが関数である場合は、Python 3 に相当するものです。もちろん、Python 3 を使用している場合は ;-) は正しいです (もちろん、通常は、文字列をコンパイルするよりも微妙な方法でコード オブジェクトを取得しますが、それはあなたの質問にとって重要ではありません;-)。

古いバージョンの Pythonでは、newモジュールの代わりにモジュールを使用typesして、最初に新しいモジュール オブジェクトを作成していましたがnew、Python 2.6 以降では非推奨であり、Python 3 では削除されています。

于 2010-02-23T00:34:56.870 に答える