运行 一个文件通过解释器改变了当前目录?

Running a file via the interpreter changes current directory?

当我尝试 $> python ./tools/test.py 时出现导入错误,无法导入存在于我调用 python 的目录中的模块。但是,我可以导入此模块,$> python -c "import mod" 有效。

我依赖于 ./(实际上)在 PYTHONPATH 上这一事实。

当我 运行 存在于不同目录中的脚本上的解释器时,python 对 python 路径做了什么?有没有办法 "lock" 当前工作目录,以便导入工作?

我的设置:

./mod.py :

x = 5     # just for demonstration purposes

./tools/test.py :

from mod import x
# ... snip ... actual content

我正在从包含 mod.pytools/ 的目录中调用 python:

$> python -c "from mod import x"      # works fine
$> python tools/test.py

Traceback (most recent call last):

File "tools/test.py", line 1, in <module>
from mod import x
ModuleNotFoundError: No module named 'mod'

请注意,包含 mod.pytools 的当前目录在我的 PYTHONPATH 中是 而不是

I'm relying on the fact that ./ is (in effect) on the PYTHONPATH.

不是。它不在 PYTHONPATH 上,也不在 sys.path 上。当您按文件路径 运行 脚本时, 脚本的 目录会添加到 sys.path。您可以在 Python command line docs.

中看到为 运行 指定程序的每种方式添加到 sys.path 的内容