是否会首先搜索PYTHONPATH中的第一个源?

时间:2013-08-02 05:45:24

标签: python pythonpath

PYTHONPATH中的来源是否会按照列出的顺序进行搜索?或者他们的顺序可能会改变吗?

我想知道的具体情况是在Python启动之前PYTHONPATH的视图,以及它与Python实际使用它的方式不同。

3 个答案:

答案 0 :(得分:1)

它实际上是中等复杂的。故事从C代码开始,最初看$PYTHONPATH,但从那里继续。

在所有情况下,尤其是如果Python作为嵌入式解释器被调用(包括"框架" MacOS X上的东西),至少有一点"魔术"完成建立内部路径字符串。 (嵌入时,运行嵌入式Python解释器的任何内容都可以调用Py_SetPath,否则python会尝试找出它的调用方式,然后调整并添加lib/pythonX.Y,其中X和Y是主要和次要版本号。)完成内部路径构建,以便Python可以找到自己的标准模块,例如collectionsos以及sys$PYTHONHOME也会影响此过程。但是,一般情况下,环境$PYTHONPATH变量 - 除非通过-E抑制 - 在半魔法默认路径前面结束。

整个schmear用于设置sys.path的初始值。但是一旦Python启动,它就会加载site.py(除非通过-S抑制)。这会相当广泛地修改sys.path - 通常保留从$PYTHONPATH导入的内容,按照原始顺序,但在前面推送很多东西(如系统蛋)。 1 此外,它所做的一件事就是加载 - 如果它存在 - 每个用户文件$HOME/.local/lib/pythonX.Y/sitepackages/usercustomize.py,而 可以做任何事情,那么就没有保证:

$ cat usercustomize.py
print 'hello from usercustomize'
$ python
hello from usercustomize
Python 2.7.5 (default, Jun 15 2013, 11:50:00) 
[GCC 4.2.1 20070831 patched [FreeBSD]] on freebsd9
Type "help", "copyright", "credits" or "license" for more information.
>>> 

如果我要说:

import random, sys
random.shuffle(sys.path)

这会扰乱sys.path,将$PYTHONPATH个元素按随机顺序排列。可以说这是一个"好吧,你自己开枪,那是你的问题"。 :-)但是我导入的任何内容都可能同样与sys.path混乱,因此除了我自己的usercustomize.py以外的其他东西可能破坏所需的效果($PYTHONPATH排序保留)。


1 脚注(后期编辑):实际上鸡蛋来自site-packages/site.py,它自己的os.getenv("PYTHONPATH")。所以它在某种程度上更加混乱。一般原则适用:标准代码应该保留路径顺序,但你可以打破它。

答案 1 :(得分:0)

PYTHONPATH传递给sys.path,任何模块都可以在导入另一个模块之前修改它。

答案 2 :(得分:0)

是的,它将按照<{1}}中列出的路径的相同顺序搜索始终,但您可以执行 PYTHONPATH
它会将您的模块添加到 import sys
sys.path.insert(0, 'path/to/your/module')
中的第一位 看看http://docs.python.org/2/tutorial/modules.html#the-module-search-path