0

PYTHONPATH 中的源是否总是按照它们列出的顺序进行搜索?或者它们的顺序可能会在某个地方改变?

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

4

3 回答 3

1

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

PYTHONPATH

于 2013-08-02T06:30:51.487 回答
1

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

在所有情况下,但特别是如果 Python 被作为嵌入式解释器调用(包括 MacOS X 上的“框架”内容),至少要完成一点“魔术”来构建内部路径字符串。(当嵌入时,任何运行嵌入式 Python 解释器的东西都可以调用Py_SetPath,否则 python 会尝试找出它是如何被调用的,然后调整并添加lib/pythonX.YX 和 Y 是主要和次要版本号的位置。)这个内部路径构造是这样完成的Python 可以找到自己的标准模块,例如collectionsandossys. $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")。所以在某种程度上,它甚至更加混乱。但一般原则适用:标准代码保留路径顺序,但您可以破坏它。

于 2013-08-02T07:09:15.667 回答
0

PYTHONPATH 传递给 sys.path 任何模块都可以在导入其他模块之前对其进行修改。

于 2013-08-02T06:29:34.993 回答