2012-03-06 70 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