PYTHONPATH中的来源是否会按照列出的顺序进行搜索?或者他们的顺序可能会改变吗?
我想知道的具体情况是在Python启动之前PYTHONPATH的视图,以及它与Python实际使用它的方式不同。
答案 0 :(得分:1)
它实际上是中等复杂的。故事从C代码开始,最初看$PYTHONPATH
,但从那里继续。
在所有情况下,尤其是如果Python作为嵌入式解释器被调用(包括"框架" MacOS X上的东西),至少有一点"魔术"完成建立内部路径字符串。 (嵌入时,运行嵌入式Python解释器的任何内容都可以调用Py_SetPath
,否则python会尝试找出它的调用方式,然后调整并添加lib/pythonX.Y
,其中X和Y是主要和次要版本号。)完成内部路径构建,以便Python可以找到自己的标准模块,例如collections
和os
以及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
中的第一位
看看http://docs.python.org/2/tutorial/modules.html#the-module-search-path
sys.path.insert(0, 'path/to/your/module')