Происходит следующее: когда 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__']
относятся к двум разным объектам.Решение, вероятно, состоит в том, чтобы поместить следующие строки в качестве a.py
import __main__ as a # due to Ignacio Vazquez-Abrams
. Таким образом, для любого другого модуля также будет import a
.В целом, хотя, я действительно не понимаю, почему вы хотели бы сделать это.Вероятно, есть лучший способ сделать это.