2012-03-06 80 views
15

好了,所以我真的想得到這個權利,因爲我生成一些大的py2app/py2exe包時,我一直運行它。所以我有我的軟件包,其中包含許多模塊/軟件包,可能也位於用戶站點軟件包/默認位置(如果用戶具有python分發版),但我希望分發軟件包在從我的分發版運行之前在它們之前生效。蟒蛇路徑和進口順序

從我讀過 here PYTHONPATH應該是第一件事

現在添加到當前目錄後,從然而sys.path中,我已經在我的機器上測試的情況並非如此,所有的文件夾中定義在$site-packages$/easy-install.pth中優先於此。

所以可能有人請給我多一些在這個進口秩序深入的解釋//幫我找到一種方法來設置環境變量以這樣的方式,我分發包的優先級高於默認安裝的。到目前爲止,我的嘗試,例如在Mac-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添加到包蟒蛇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項目時,最簡單的方法是分發所有必要的模塊,並與它一起的pythonXX.dll,所以它是一個自包含的包不會被任何當前已安裝的Python版本會受到影響。另一個有趣的項目可能是virtualenv(http://pypi.python.org/pypi/virtualenv) – cwa 2012-03-06 18:49:16

+0

因此,分發pythonXX.dll應該停止剛纔描述的過程? .dll應該在分發文件夾的哪個級別?我問,因爲目前我正在將pythonXX.dll添加到軟件包中,但問題仍然存在。 – Bogdan 2012-03-07 07:25:52