Python模块导入路径疑问:sys.path为何不是脚本启动目录?
问题解答
为什么sys.path里是main_folder/tests而不是main_folder?
Python在直接运行脚本文件时,会自动把该脚本所在的目录添加到sys.path的最前端,这个规则和你执行命令时的工作目录(os.getcwd()返回的路径)是完全独立的两个概念。
你执行的命令是python tests/test01.py,脚本test01.py实际在main_folder/tests目录下,所以Python会自动把这个路径加入sys.path;而你执行命令的工作目录main_folder并不会被自动添加到sys.path里,这就是为啥找不到some_package的原因——some_package在main_folder下,但main_folder不在sys.path的搜索路径中。
解决办法
这里给你几种可行的方案:
方案1:手动把main_folder加入sys.path
在test01.py的开头添加以下代码,动态把上级目录(也就是main_folder)加入搜索路径:
import sys from pathlib import Path # 获取当前脚本所在目录的上级目录(main_folder) root_dir = Path(__file__).parent.parent sys.path.append(str(root_dir)) # 现在就能正常导入了 import some_package
方案2:用模块方式执行脚本(推荐用于项目测试)
给tests目录添加一个空的__init__.py文件,把它变成Python包,然后在main_folder下执行:
python -m tests.test01
这种情况下,Python会把当前工作目录(main_folder)加入sys.path,同时你可以在test01.py里用相对导入:
from .. import some_package
方案3:设置PYTHONPATH环境变量
执行脚本前,先把main_folder设置到PYTHONPATH中:
- Linux/macOS:
export PYTHONPATH="./" python tests/test01.py - Windows(命令提示符):
set PYTHONPATH=./ python tests/test01.py
这样Python会自动把main_folder加入sys.path,无需修改脚本代码。
内容的提问来源于stack exchange,提问作者Carlo
相关产品推荐
相关产品推荐

