为什么sys.path不包含当前工作目录(cwd)?

8 投票
3 回答
5038 浏览
提问于 2025-04-18 15:40

我在Linux操作系统下使用python3和emacs(编辑器和终端)。为什么当前工作目录(cwd)不在sys.path里面呢?我们怎么才能让它在所有会话中都能使用呢?谢谢你。

3 个回答

0

你可以改变你的 PYTHONPATH 环境变量。这个变量会把一些路径加到默认的模块搜索路径前面。根据文档,当你从命令行运行一个脚本时,sys.path 的第一个项目会是这个脚本的路径。文档还提到,sys.path 是从环境变量 PYTHONPATH 初始化的,加上一个依赖于安装的默认值。

举个例子,如果 PYTHONPATH 是空的(在 PowerShell 中可以用 $env:PYTHONPATH = "" 设置),那么只会添加安装时的默认值。

但是,如果 PYTHONPATH 以一个空字符串开头,那么当前工作目录(也就是你运行脚本的地方)会被加到 PYTHONPATH 中。即使只是一个初始的分隔符,比如在 PowerShell 中用分号 $env:PYTHONPATH = ";",也会添加这个目录。

这种行为并不总是你想要的,所以在对 PYTHONPATH 做永久性修改之前,最好先考虑一下。

10

应该把 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 文件或包都会覆盖那个模块,容易导致程序出错。

撰写回答