何が起こっているかというと、 をb.py
しようとすると、エントリが の下import a
にあるため、 にエントリがありません。これにより、インポート メカニズムがモジュールを再インポートし、名前の下に配置します。そのため、モジュールとまったく関係のないモジュールがあります。このようなものに変更すると、うまくいきます。sys.modules
__main__
a
a
__main__
b.py
import sys
a = sys.modules['__main__']
def changeVars():
print a.test1, a.test2, a.test3 #prints 'a', None, 3
a.test1 = 'NEW VAR 1'
a.test2 = 'NEW VAR 2'
a.test3 = 'NEW VAR 3'
print a.test1, a.test2, a.test3 #prints 'NEW VAR 1', 'NEW VAR 2', 'NEW VAR 3'
収量
aaron@aaron-laptop:~/code/tmp$ python a.py
a None 3
a None 3
NEW VAR 1 NEW VAR 2 NEW VAR 3
NEW VAR 1 NEW VAR 2 NEW VAR 3
aaron@aaron-laptop:~/code/tmp$
何が起こっているかのより良い例を得るために、次のファイルを検討してください。
#a.py
import b
import a
test = 'Foo'
if __name__ == '__main__':
print test #prints 'Foo'
b.changeVars()
print a.test, test # prints 'Foo', 'Bar'
と
#b.py
import a as a1
import sys
a2 = sys.modules['__main__']
def changeVars():
print a1.test, a2.test # Prints 'Foo', 'Foo'
a2.test = 'Bar'
print a1.test, a2.test # Prints 'Foo', 'Bar'
どの出力
Foo
Foo Foo
Foo Bar
Foo Bar
sys.modules['a']
これは、とsys.modules['__main__']
が 2 つの異なるオブジェクトを参照していることを明確に示しています。解決策は、おそらく次の行を最初の行として配置することですa.py
import __main__ as a # due to Ignacio Vazquez-Abrams
このようにすることで、他のモジュールでimport a
も同様に行うことができます。全体として、なぜあなたがこれをやりたいのか、私には本当にわかりません。これを実現するためのより良い方法がおそらくあります。