PYTHONPATH 中的源是否总是按照它们列出的顺序进行搜索?或者它们的顺序可能会在某个地方改变?
我想知道的具体情况是 Python 启动之前的 PYTHONPATH 视图,以及它是否与 Python 实际使用它的方式不同。
PYTHONPATH 中的源是否总是按照它们列出的顺序进行搜索?或者它们的顺序可能会在某个地方改变?
我想知道的具体情况是 Python 启动之前的 PYTHONPATH 视图,以及它是否与 Python 实际使用它的方式不同。
是的,它将始终按照与中列出的路径相同的顺序进行搜索PYTHONPATH
,但是您可以这样做
它将您的模块添加到第一位,以
查看http://docs.python.org/2/tutorial/modules。 html#the-module-search-path
import sys
sys.path.insert(0, 'path/to/your/module')PYTHONPATH
它实际上是中等复杂的。故事从 C 代码开始,这是最初的样子$PYTHONPATH
,但从那里继续。
在所有情况下,但特别是如果 Python 被作为嵌入式解释器调用(包括 MacOS X 上的“框架”内容),至少要完成一点“魔术”来构建内部路径字符串。(当嵌入时,任何运行嵌入式 Python 解释器的东西都可以调用Py_SetPath
,否则 python 会尝试找出它是如何被调用的,然后调整并添加lib/pythonX.Y
X 和 Y 是主要和次要版本号的位置。)这个内部路径构造是这样完成的Python 可以找到自己的标准模块,例如collections
andos
和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")
。所以在某种程度上,它甚至更加混乱。但一般原则适用:标准代码应保留路径顺序,但您可以破坏它。
PYTHONPATH 传递给 sys.path 任何模块都可以在导入其他模块之前对其进行修改。