好的,所以我真的想把这个弄对,因为在生成一些大的py2app/py2exe包时,我一直在运行它。因此,我的包中包含许多模块/包,这些模块/包也可能位于用户站点包/默认位置(如果用户具有python发行版),但我希望从发行版运行时,我的分布式包在它们之前生效。
现在从我所读到的herePYTHONPATH应该是在当前目录之后添加到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添加到包中的PYTHON EXE的路径。现在,在一台没有安装python的机器上,这个方法运行得很好。但是,当python发行版已经存在时,它们的站点包优先。
Python按顺序搜索
sys.path
中的路径(请参见http://docs.python.org/tutorial/modules.html#the-module-search-path)。easy_install直接更改此列表(请参阅easy-install.pth文件中的最后一行):这基本上接受添加的任何目录,并将它们插入列表的开头。
另请参见Eggs in path before PYTHONPATH environment variable。
导入模块后,python首先从目录列表中搜索。 如果找不到,则从目录列表中搜索。python可能会在您的操作系统上搜索其他列表
输出是目录列表:
time
模块按照sys.modules
和sys.path
列表的顺序导入。编辑:怎么回事,比分是-1?为什么?我在这里所说的一切都是正确的,有到Python文档的链接作为证明。。。严肃的wtf?
此页面是“Python导入顺序”的高Google结果,因此希望这里有一个更清楚的解释:
正如这两页所解释的,
import
顺序是:sys.modules
中看到列表。sys.path
条目。正如
sys.path
文档页面所解释的,它被填充如下:python
开头的文件目录的完整路径(因此/someplace/on/disk/> $ python /path/to/the/run.py
表示第一个路径是/path/to/the/
,同样,如果您在/path/to/> $ python the/run.py
(它仍然将被设置为目录的完整路径)),或者,如果python是在没有文件aka interactive mode的情况下启动的(空字符串表示“python进程的当前工作目录”)。换言之,Python假设您启动的文件希望能够执行与启动Python的文件位于同一位置的package/-folders
和blah.py
模块的相对导入。sys.path
中的其他条目由PYTHONPATH
环境变量填充。基本上是你的全局pip文件夹。所以,基本上:是的,您可以相信Python会在全局安装pip之前首先找到本地包文件夹和模块文件。
这里有一个例子可以进一步解释:
相关问题 更多 >
编程相关推荐