如何从 Python 脚本(或交互式 shell)中找出系统的 PYTHONPATH
变量中列出了哪些目录?
PYTHONPATH
。为此使用 sys.path
。
sys.path
是“指定模块搜索路径的字符串列表” - docs.python.org/2/library/sys.html#sys.path。 PYTHONPATH 是一个影响此列表的环境变量。根据任何合理的定义,sys.path
是您的“python 路径”。
python -m site
。
你可能还想要这个:
import sys
print(sys.path)
或作为从终端的一个班轮:
python -c "import sys; print('\n'.join(sys.path))"
警告:如果您安装了多个 Python 版本,则应使用相应的命令 python2
或 python3
。
sys.path
可能包含您的 PYTHONPATH
环境变量中未明确包含的项目。要直接查询变量,请使用:
import os
try:
user_paths = os.environ['PYTHONPATH'].split(os.pathsep)
except KeyError:
user_paths = []
sys.path
。
似乎无法编辑其他答案。有一个小错误,因为它是仅限 Windows 的。更通用的解决方案是使用 os.pathsep 如下:
sys.path 可能包含不在您的 PYTHONPATH 环境变量中的项目。要直接查询变量,请使用:
import os
os.environ.get('PYTHONPATH', '').split(os.pathsep)
os.sep
返回操作系统的目录分隔符,例如 /
。 Python 路径中使用的分隔符不同,由 os.pathsep
返回,如接受的答案所示。
PYTHONPATH 是一个环境变量,其值为目录列表。设置后,Python 使用它来搜索导入的模块以及其他标准。和 Python 的“sys.path”中列出的第 3 方库目录。
与任何其他环境变量一样,您可以将其导出到 shell 或 ~/.bashrc 中,请参阅 here。您可以在 Python 中查询 os.environ['PYTHONPATH'] 的值,如下所示:
$ python3 -c "import os, sys; print(os.environ['PYTHONPATH']); print(sys.path) if 'PYTHONPATH' in sorted(os.environ) else print('PYTHONPATH is not defined')"
IF 在 shell 中定义为
$ export PYTHONPATH=$HOME/Documents/DjangoTutorial/mysite
那么结果 =>
/home/Documents/DjangoTutorial/mysite
['', '/home/Documents/DjangoTutorial/mysite', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']
其他结果 =>
PYTHONPATH is not defined
要将 PYTHONPATH 设置为多个路径,请参阅 here。
请注意,可以在运行时通过 sys.path.insert()、del 或 remove() 添加或删除搜索路径,但不能通过 os.environ[]。例子:
>>> os.environ['PYTHONPATH']="$HOME/Documents/DjangoTutorial/mysite"
>>> 'PYTHONPATH' in sorted(os.environ)
True
>>> sys.path // but Not there
['', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']
>>> sys.path.insert(0,os.environ['PYTHONPATH'])
>>> sys.path // It's there
['$HOME/Documents/DjangoTutorial/mysite', '', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']
>>>
总之,PYTHONPATH 是为 sys.path 中的导入模块指定 Python 搜索路径的一种方式。您还可以在没有 PYTHONPATH 的帮助下直接将列表操作应用于 sys.path。
在 Windows 10 中工作,与 vanuan 的答案基本相同,但更干净(取自某处,不记得在哪里......):
import sys
for p in sys.path:
print(p)
import sys; print('\n'.join(sys.path))
import subprocess
python_path = subprocess.check_output("which python", shell=True).strip()
python_path = python_path.decode('utf-8')
PYTHONPATH
不是“Python 所在的位置”,而是一个具有用于搜索模块的附加路径的环境变量。
当 Python 给我一条错误消息时,它会告诉我它在哪里 :)
>>> import os
>>> os.environ['PYTHONPATH'].split(os.pathsep)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\martin\AppData\Local\Programs\Python\Python36-32\lib\os.py", line 669, in __getitem__
raise KeyError(key) from None
KeyError: 'PYTHONPATH'
>>>
PYTHONPATH
不是“Python 所在的位置”,而是一个具有用于搜索模块的附加路径的环境变量。
使用命令,
$ which python
记得在正确的环境中输入这个,所以使用:
$ conda activate <env>
或者
$ mamba activate <env>
如果您没有 conda 环境,$ which python
或 $ which python3
就可以了。
PYTHONPATH
不是“Python 所在的位置”,而是一个具有用于搜索模块的附加路径的环境变量。
如果使用 conda,您可以使用 os.environ["CONDA_PREFIX"]
获取 env 前缀。
import sys
for a in sys.path:
a.replace('\\\\','\\')
print(a)
它将提供所有准备好放置在 Windows 中的路径。
.replace
不会修改字符串,而是创建一个在此代码中被忽略的 new 字符串。这并不重要,因为无论如何都没有充分的理由来避免反斜杠。 sys.path
中的路径字符串可以在该系统上按原样使用。
不定期副业成功案例分享
python -c "import sys; print('\n'.join(sys.path))"