PYTHONPATH中到底应该设置什么?
我正在为公司里的其他开发者写一个Python项目的设置文档,最近在研究PYTHONPATH
这个环境变量。我查看了我当前的开发系统,发现可能有一些设置不对,这导致我的IDE(IntelliJ)在查找Python库时出现了问题。
我看过了文档,这里和这里都有相关信息,但我还是不太确定PYTHONPATH
环境变量里到底应该放些什么。
我把PYTHONHOME
指向了C:\Python27
。
我现在的PYTHONPATH
设置为PYTHONHOME
。我是否也应该把sys.path
中的目录添加进去呢?
更新:
根据下面的信息,PYTHONPATH
并不需要设置,除非你有一些非标准的库想让Python默认能找到。例如,当我从安装程序安装wxPython时,它会把它的库添加到PYTHONPATH
中。我确实把PYTHONHOME
设置为Python安装的根目录,这样我就可以把它添加到系统的PATH
环境变量中,这样我就可以在任何地方运行Python。
4 个回答
我学到的内容是: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
对于大多数安装情况,你其实不需要设置这些变量,因为它们对Python的运行并没有影响。Python自己知道在哪里可以找到它的标准库。
唯一需要设置PYTHONPATH的情况是,当你有一些自定义的Python库,不想把它们安装到默认的全局位置(也就是site-packages
目录)时。
确保你阅读一下这个链接的内容:http://docs.python.org/using/cmdline.html#environment-variables
你不一定要设置这两个变量。PYTHONPATH
可以用来指向一些额外的目录,这些目录里放着私有的库。而 PYTHONHOME
则是用来设置默认库的位置。
文档链接:
PYTHONHOME
这个变量可以改变标准 Python 库的位置。默认情况下,Python 会在 prefix/lib/pythonversion 和 exec_prefix/lib/pythonversion 这两个地方寻找库,其中 prefix 和 exec_prefix 是根据安装情况而定的目录,默认都是 /usr/local。如果
PYTHONHOME
设置为一个单独的目录,它的值会替代 prefix 和 exec_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
这个变量来操作搜索路径。