2012-03-06 7 views
15

大丈夫ですので、大きなpy2app/py2exeパッケージを生成するときに実行し続けるため、この権利を得たいと思っています。だから、自分のパッケージには、ユーザサイトのパッケージ/デフォルトの場所(ユーザがPythonのディストリビューションを持っている場合)にあるかもしれない多くのモジュール/パッケージが含まれていますが、自分のディストリビューションから実行するときに、 。私はherePYTHONPATHを読んだから今pythonのパスとインポートの順

は、第一のものは、しかし、私はそうではありません私のマシン上でテストされ、定義されたすべてのフォルダだことから、現在のディレクトリの後のsys.pathに追加する必要があります$site-packages$/easy-install.pthの方が優先されます。

誰かがこのインポートオーダーに関する詳細な説明を私に与えてくれますか?私が配布したパッケージがデフォルトのものよりも優先されるように環境変数を設定する方法を見つけるのを助けてくれますか?これまでのところ私の試みは、私のエントリポイントスクリプトで、マック-OSのpy2appに例えば、次のとおりです。

os.environ['PYTHONPATH'] = DATA_PATH + ':' 
os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.path.join(DATA_PATH 
                  , 'lib') + ':' 
os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.path.join(
           DATA_PATH, 'lib', 'python2.7', 'site-packages') + ':' 
os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.path.join(
          DATA_PATH, 'lib', 'python2.7', 'site-packages.zip') 

これは基本的にpy2appによって生成されたパッケージの構造です。その後、私はちょうど:

SERVER = subprocess.Popen([PYTHON_EXE_PATH, '-m', 'bin.rpserver' 
          , cfg.RPC_SERVER_IP, cfg.RPC_SERVER_PORT], 
          shell=False, stdin=IN_FILE, stdout=OUT_FILE, 
          stderr=ERR_FILE) 

ここPYTHON_EXE_PATHは、パッケージにpy2appによって追加されたPythonのexeファイルへのパスです。これは、pythonがインストールされていないマシンでうまく動作します。しかし、すでにPythonディストリビューションが存在する場合、そのサイトパッケージが優先されます。

答えて

13

Pythonはsys.pathのパスを順番に検索します(http://docs.python.org/tutorial/modules.html#the-module-search-path参照)。 easy_installをは(あなたの容易な-install.pthファイルの最後の行を参照してください)このリストを直接変更します。

import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new) 

これは基本的に追加されているものは何でもディレクトリ取り、リストの先頭にそれらを挿入します。

Eggs in path before PYTHONPATH environment variableも参照してください。

+0

py2exeプロジェクトを配布するときに最も簡単なオプションは、Pythonの現在インストールされているバージョンの影響を受けない自己完結型パッケージであるように、必要なモジュールとpythonXX.dllを一緒に配布することです。あなたのためのもう一つの興味深いプロジェクトはvirtualenv(http://pypi.python.org/pypi/virtualenv) – cwa

+0

かもしれません。pythonXX.dllを配布すると、私はちょうど起こったことで説明したプロセスを停止するはずですか? .dllは配布フォルダのどのレベルにあるべきですか?私は現在、pythonXX.dllをパッケージに追加しているので、依頼していますが、それでも問題は発生します。 – Bogdan

関連する問題