2011-09-01 9 views
1

私が書いたPythonライブラリがあります。ライブラリがどのように動作するかを変える一連の変数があります。テストではすべてうまくいきましたが、python lib.py installの変数はライブラリに何の影響も与えません。私は、可能な最も単純な例にこれを決裂:ライブラリはインストールされているかどうかによって動作が異なります

図書館:

##lib.py 
    config="Original" 

    def run(): 
     print config 

スクリプト:

import lib 

    lib.config="New" 
    lib.run() 
    print lib.config 

をスクリプトと同じディレクトリにライブラリを配置し、それに出力を実行した場合であります:

New 
    New 

ただし、ライブラリをインストールしてから、そのライブラリを使用してスクリプトを試してみるとtパッケージ出力は:

Original 
    New 

誰かが何が起こっているか説明できますか?私はちょっと混乱して、出来事と理由にひどく興味があります。また、私は完全に間違ってprogramatical設定をやっている?

編集

それは問題がのinitの.pyファイルで判明しました。基本的には、別のライブラリをインポートするだけのライブラリをインポートするのと同じです。インストールされたモジュールをインポートすると、フォルダlibとファイル .pyが表示されます。 初期 .pyはちょうど1つのライナーfrom lib import *です。それは単に実際のライブラリであるふりをしますが、グローバル変数を使用すると奇妙な問題を引き起こします。基本的に何が起こっているかのシミュレートされた例:

##init.py 
from lib import * 

スクリプト:

import init 

init.config = 'New' 
init.run() 
print init.config 
出力

Original 
New 

機能の実行が()lib.pyでconfigを探しますが、print init.config init.pyで探します。みんな助けてくれてありがとう。修正方法は、モジュールのインストール方法を変更することです(初期 .pyはありません)。最終的には、すべてのグローバル変数を削除したいと考えていますが、当面はすべてが完璧に機能します。

+0

構成は、静的に行う*本当に*良い*理由がない限り、一般的に静的(グローバル)ではなくオブジェクト単位のインスタンスである必要があります。それでも、オブジェクトインスタンスは、あらゆる種類のグローバル設定をオーバーライドすることをサポートする必要があります。 – cdhowie

+1

また、この動作をPython 2.6.6で再現することはできません。 – cdhowie

+1

@trydyingtoliveあなたが描写していることは、妥当と思われません。 –

答えて

2

あなたの記述は、Pythonがどのように動作するか(あなたが好きな場合は、「あなたが正確にその結果を得たとは信じられません」と読んでいる)と矛盾するでしょう。

異なる場所または異なる方法でlibをインポートすると、モジュールの2つのコピー、または現在のディレクトリlibのいずれかの2つのコピーで終わる可能性があります。インストールされたlibの場合、これは「オリジナル」/「新規」の動作になります。

+0

私はあまりにも理由があると思った。だから私は2つの図書館を同じ名前にしなかった。また、Pythonがどのように動作するかはあなたには同意します。これが私にとって驚くべき理由です。 – trydyingtolive

+0

@trydyingtolive:次に、それを特定しようとするために、あなたがそれを使っている場所で 'print lib'を実行し、パスを比較してください。それらが同じであれば、モジュールオブジェクトのアイデンティティの比較を開始します。 'sys.modules'を見ることも役に立ちます。 –

+0

私が見る大きな違いは、あなたがlib.pycとして実行されている同じディレクトリから実行すると、インストールされているから実行すると、__init __からpycを実行するということです。すべての__init__はimport *です。 – trydyingtolive