为什么sys.path不包含当前工作目录(cwd)?
我在Linux操作系统下使用python3和emacs(编辑器和终端)。为什么当前工作目录(cwd)不在sys.path里面呢?我们怎么才能让它在所有会话中都能使用呢?谢谢你。
3 个回答
你可以改变你的 PYTHONPATH
环境变量。这个变量会把一些路径加到默认的模块搜索路径前面。根据文档,当你从命令行运行一个脚本时,sys.path
的第一个项目会是这个脚本的路径。文档还提到,sys.path
是从环境变量 PYTHONPATH
初始化的,加上一个依赖于安装的默认值。
举个例子,如果 PYTHONPATH
是空的(在 PowerShell 中可以用 $env:PYTHONPATH = ""
设置),那么只会添加安装时的默认值。
但是,如果 PYTHONPATH
以一个空字符串开头,那么当前工作目录(也就是你运行脚本的地方)会被加到 PYTHONPATH
中。即使只是一个初始的分隔符,比如在 PowerShell 中用分号 $env:PYTHONPATH = ";"
,也会添加这个目录。
这种行为并不总是你想要的,所以在对 PYTHONPATH
做永久性修改之前,最好先考虑一下。
sys.path
不是系统路径,而是 python
在查找模块时会检查的路径(比如你执行 import
语句的时候)。
如果想要永久改变这个路径,可以修改环境变量 PYTHONPATH
。
你不应该把 cwd()
加到 sys.path
里。总是加上 cwd()
是个糟糕的主意,因为这样你就无法控制哪些文件可以被导入了。
Python 会自动添加正在执行的脚本所在的目录。
比如,当你运行:
python.exe path/to/script.py
时,path/to
会自动被加到 sys.path
里。
只有当你从当前目录运行脚本时,''
会被加到路径的开头,这意味着当前工作目录会被用来查找导入的模块。比如,当你运行 python.exe localfile.py
时,Python 会把当前工作目录加进去,因为它假设你在导入时不会改变当前工作目录。
你可以查看 接口选项 在 命令行和环境 的文档中:
如果脚本名称直接指向一个 Python 文件,那么包含该文件的目录会被加到
sys.path
的开头,并且该文件会作为__main__
模块执行。
还有 sys.path
的文档:
在程序启动时初始化时,这个列表的第一个项目
path[0]
是用来调用 Python 解释器的脚本所在的目录。如果脚本目录不可用(例如,如果解释器是交互式调用的,或者脚本是从标准输入读取的),path[0]
就是空字符串,这样 Python 会首先在当前目录中查找模块。注意,脚本目录会被插入到PYTHONPATH
结果插入的条目之前。
你可以随时显式地把当前工作目录加到 sys.path
里:
import sys
if sys.path[0] != '':
sys.path.insert(0, '')
但要小心,当前工作目录中任何与您代码中已经使用的模块同名的 Python 文件或包都会覆盖那个模块,容易导致程序出错。