0

短くするために、これを行うモジュールがあります。

MyModule
----mymodule.py
----__init__.py

mymodule.py

# Get the name of the current module
current_module = __import__(__name__)
setattr(current_module, 'VarA', 5)

したがって、MyModule フォルダー内にある場合、シェルを開くと、次のように動作します。

import mymodule
print mymodule.VarA

しかし、私が MyModule フォルダーの外にある場合は、次のようにします。

from MyModule import mymodule
print mymodule.VarA

私が得る: 、私はそれがどこか別の場所に設定されて'module' object has no attribute 'VarA'いるために起こっていると思います。setattrVarAVarA

4

1 に答える 1

1

のドキュメントを読んだ場合__import__:

name 変数が の形式の場合、通常、 name で指定されたモジュールではなくpackage.module、最上位パッケージ (最初のドットまでの名前) が返されます。ただし、空でない fromlist 引数が指定された場合は、名前で指定されたモジュールが返されます。

そして、これは非常に簡単にわかります。

MyModule/mymodule.py:

current_module = __import__(__name__)
print current_module

プログラムは次のように出力します。

<module 'MyModule' from '/Users/abarnert/src/test/pkgtest3/MyModule/__init__.pyc'>

Python 2.7 を使用している場合は、この部分まで残りのドキュメントをざっと読むことができます。

モジュール (パッケージ内の可能性がある) を名前でインポートするだけの場合は、importlib.import_module().

だから、それをしてください:

import importlib
current_module = importlib.import_module(__name__)
setattr(current_module, 'VarA', 5)

以前の 2.x バージョンで作業する必要がある場合は、セクション全体をお読みください (上記でリンクした 2.7 ではなく、お使いの Python バージョンについて)。正しい答えはもう少し複雑で、少しハックです:

import sys
current_package = importlib.import_module(__name__)
current_module = sys.modules[__name__]
setattr(current_module, 'VarA', 5)

もちろん、MyModule/mymodule.py をトップレベル スクリプトとして実行execfileしたり、カスタム インポート ロジックを使用したりしないのであれば、そもそもこの複雑さは必要ありません。誰かがすでにimportあなたを編集しているに違いないので、次のようにしてください。

import sys
current_module = sys.modules[__name__]
setattr(current_module, 'VarA', 5)

もちろん、ここでの最も簡単な解決策は次のとおりです。

変数 = 5

…しかし、実際のコードでは機能しない正当な理由があると思われます。

于 2013-10-01T01:21:09.613 に答える