运行 一个文件通过解释器改变了当前目录?
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.py
和 tools/
的目录中调用 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.py
和 tools
的当前目录在我的 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
的内容
当我尝试 $> 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.py
和 tools/
的目录中调用 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.py
和 tools
的当前目录在我的 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
的内容