存在三个模块。 Cfg,Main和Component
value = 0
import Cfg
class index:
def GET(self):
return Cfg.value
from Test import Cfg
import Component
urls = ('/', 'Component.index')
if __name__ == '__main__':
Cfg.value = 1
app = web.application(urls, globals())
app.run()
获取Component.Index的方法返回0,但我期待1.我错过了什么?
首先修改main.py进行测试:
from test import Cfg
import Component
import test
if __name__ == '__main__':
importedCfg = id(Cfg)
cfgInComponent = id(Component.Cfg)
cfgInTest = id(test.Cfg)
print importedCfg, cfgInComponent, cfgInTest
print importedCfg == cfgInComponent == cfgInTest
结果:
36202928 36203088 36202928 假
main.py中的第二次修改:
import Cfg
import Component
if __name__ == '__main__':
importedCfg = id(Cfg)
cfgInComponent = id(Component.Cfg)
# cfgInTest = id(test.Cfg)
print importedCfg, cfgInComponent
print importedCfg == cfgInComponent
36858160 36858160真
如果您不想创建多个实例,则应遵循第二种方式。
答案 0 :(得分:1)
如果你的pythonpath包含你的包的父目录和你的包的子目录,你可能会遇到这样的情况,即python认为它导入了不同的模块,因为它们与它们不同方式。
这是一个完整的,有效的例子。
import tempfile
import sys
import os
base = tempfile.mkdtemp()
os.mkdir(os.path.join(base, 'examplepackage'))
f = open(os.path.join(base, 'examplepackage', '__init__.py'), 'w')
f.close()
f = open(os.path.join(base, 'examplepackage', 'bar.py'), 'w')
f.write('a = 1')
f.close()
sys.path.append(base)
sys.path.append(os.path.join(base, 'examplepackage'))
import examplepackage.bar as package_bar
import bar
bar.a = 2
print bar.a
print package_bar.a
print [m for m in sys.modules.keys() if 'bar' in m]
您会看到bar.a
已更改,而package_bar.a
尚未更改。您还会看到sys.modules
缓存中有两个模块,名称中都带有“bar”。该字典是导入后放置模块的地方,键入其名称。
答案 1 :(得分:0)
比较结果:
from Test import Cfg
import Component
if __name__ == '__main__':
assert id(Cfg) == id(Component.Cfg)
和
import Cfg
import Component
if __name__ == '__main__':
assert id(Cfg) == id(Component.Cfg)
这意味着执行“from module”导入会创建Cfg
的不同实例。 (我也没有意识到这一点。)
Python 2.7和Python 3.2中存在此行为(未测试Python 2.6)。