PYTHONPATH中到底应该设置什么?

107 投票
4 回答
273703 浏览
提问于 2025-04-17 04:45

我正在为公司里的其他开发者写一个Python项目的设置文档,最近在研究PYTHONPATH这个环境变量。我查看了我当前的开发系统,发现可能有一些设置不对,这导致我的IDE(IntelliJ)在查找Python库时出现了问题。

我看过了文档,这里这里都有相关信息,但我还是不太确定PYTHONPATH环境变量里到底应该放些什么。

我把PYTHONHOME指向了C:\Python27

我现在的PYTHONPATH设置为PYTHONHOME。我是否也应该把sys.path中的目录添加进去呢?

更新:

根据下面的信息,PYTHONPATH并不需要设置,除非你有一些非标准的库想让Python默认能找到。例如,当我从安装程序安装wxPython时,它会把它的库添加到PYTHONPATH中。我确实把PYTHONHOME设置为Python安装的根目录,这样我就可以把它添加到系统的PATH环境变量中,这样我就可以在任何地方运行Python。

4 个回答

7

我学到的内容是:PYTHONPATH 是一个目录,用来添加到 Python 的导入搜索路径 "sys.path" 中。这个路径包括当前目录、PYTHONPATH、标准库、共享库和用户库。举个例子:

% python3 -c "import sys;print(sys.path)"
['', 
'/home/username/Documents/DjangoTutorial/mySite', 
'/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', 
'/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages']

这里第一个路径 '' 表示当前目录,第二个路径是通过

%export PYTHONPATH=/home/username/Documents/DjangoTutorial/mySite 

可以把它添加到 ~/.bashrc 文件中,这样就能让这个设置永久生效,其他的则是 Python 的标准库和动态共享库,还有一些第三方库,比如 django。

需要注意的是,不要随便修改 PYTHONHOME,甚至把它设置为 '' 或 'None' 都会导致 python3 的命令行无法工作:

% export PYTHONHOME=''
% python3
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'

Current thread 0x00007f18a44ff740 (most recent call first):
Aborted (core dumped)

要记住,如果你启动一个 Python 脚本,当前工作目录(CWD)就是这个脚本所在的目录。举个例子:

username@bud:~/Documents/DjangoTutorial% python3 mySite/manage.py runserver
==== Printing sys.path ====
/home/username/Documents/DjangoTutorial/mySite # CWD is where manage.py resides
/usr/lib/python3.6
/usr/lib/python3.6/lib-dynload
/usr/local/lib/python3.6/dist-packages
/usr/lib/python3/dist-packages

你也可以在运行时把一个路径添加到 sys.path 中: 假设你在 ~/Documents/Python 目录下有一个文件 Fibonacci.py:

username@bud:~/Documents/DjangoTutorial% python3 
>>> sys.path.append("/home/username/Documents")
>>> print(sys.path)
['', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', 
'/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages', 
'/home/username/Documents']
>>> from Python import Fibonacci as fibo

或者通过

% PYTHONPATH=/home/username/Documents:$PYTHONPATH
% python3
>>> print(sys.path)
['', 
'/home/username/Documents', '/home/username/Documents/DjangoTutorial/mySite', 
'/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', 
'/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages']
>>> from Python import Fibonacci as fibo
28

对于大多数安装情况,你其实不需要设置这些变量,因为它们对Python的运行并没有影响。Python自己知道在哪里可以找到它的标准库。

唯一需要设置PYTHONPATH的情况是,当你有一些自定义的Python库,不想把它们安装到默认的全局位置(也就是site-packages目录)时。

确保你阅读一下这个链接的内容:http://docs.python.org/using/cmdline.html#environment-variables

67

你不一定要设置这两个变量。PYTHONPATH 可以用来指向一些额外的目录,这些目录里放着私有的库。而 PYTHONHOME 则是用来设置默认库的位置。

文档链接:

PYTHONHOME
这个变量可以改变标准 Python 库的位置。默认情况下,Python 会在 prefix/lib/pythonversionexec_prefix/lib/pythonversion 这两个地方寻找库,其中 prefixexec_prefix 是根据安装情况而定的目录,默认都是 /usr/local。

如果 PYTHONHOME 设置为一个单独的目录,它的值会替代 prefixexec_prefix。如果你想为这两个设置不同的值,可以把 PYTHONHOME 设置为 prefix:exec_prefix

PYTHONPATH
这个变量用来扩展模块文件的默认搜索路径。格式和 shell 的 PATH 一样:一个或多个目录路径,用 os.pathsep 分隔(比如在 Unix 系统上用冒号分隔,在 Windows 上用分号分隔)。如果某个目录不存在,Python 会默默忽略它。

除了普通目录,PYTHONPATH 中的某些条目还可以指向包含纯 Python 模块的 zip 文件(无论是源代码还是编译后的形式)。不过,扩展模块不能从 zip 文件中导入。

默认的搜索路径是根据安装情况而定的,但通常是从 prefix/lib/pythonversion 开始(见上面的 PYTHONHOME)。这个默认路径总是会加到 PYTHONPATH 的后面。

在搜索路径中,会在 PYTHONPATH 前面插入一个额外的目录,具体情况可以参考上面的 Interface options。你也可以在 Python 程序中通过 sys.path 这个变量来操作搜索路径。

撰写回答