0

存在三个模块。配置,主要和组件

配置文件

value = 0

组件.py

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 的 Get 方法返回 0,但我期待 1。我错过了什么?

编辑#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 真

如果您不想创建多个实例,则应遵循第二种方式。

4

2 回答 2

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”。该字典是导入后放置模块的地方,并键入它们的名称。

于 2012-06-23T11:36:47.130 回答
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)

这意味着执行“从模块”导入会创建不同的Cfg. (我也不知道这一点)。

Python 2.7 和 Python 3.2 中存在此行为(Python 2.6 未经测试)。

于 2012-06-23T11:09:05.270 回答