0

3 つのモジュールが存在します。Cfg、メインおよびコンポーネント

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 の 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 の 2 番目の変更:

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 番目の方法に従う必要があります。

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.asys.modulesまた、キャッシュには 2 つのモジュールがあり、どちらも名前に「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 に答える