模块库中的web.py全局变量

时间:2012-06-22 18:50:41

标签: python singleton web.py

存在三个模块。 Cfg,Main和Component

Cfg.py

value = 0

Component.py

import Cfg

class index:
    def GET(self):
        return Cfg.value

Main.py

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.我错过了什么?

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

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

2 个答案:

答案 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)。