私が書いた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はありません)。最終的には、すべてのグローバル変数を削除したいと考えていますが、当面はすべてが完璧に機能します。
構成は、静的に行う*本当に*良い*理由がない限り、一般的に静的(グローバル)ではなくオブジェクト単位のインスタンスである必要があります。それでも、オブジェクトインスタンスは、あらゆる種類のグローバル設定をオーバーライドすることをサポートする必要があります。 – cdhowie
また、この動作をPython 2.6.6で再現することはできません。 – cdhowie
@trydyingtoliveあなたが描写していることは、妥当と思われません。 –