Python从相邻目录导入模块报ImportError,求无需改sys.path的解决方案
错误原因说明
No module named 'sorting'报错:直接运行performance.py时,Python默认仅将脚本所在的src/benchmark目录加入模块搜索路径,sorting包存放在上一级的src目录下,不在运行时的搜索范围内。VS Code无lint报错是因为IDE静态检查时默认将项目根目录、src目录加入了搜索路径,和运行时的路径规则不互通。attempted relative import with no known parent package报错:直接运行单个py文件时,Python会将该文件识别为顶层脚本,__name__属性被设为__main__,不承认它属于src.benchmark子包,因此无法识别父包做相对导入。
解决方案(均无需手动修改sys.path)
方案1:修改VS Code运行配置(适配VS Code直接点运行的场景)
更新.vscode/launch.json的配置项,新增cwd和env配置:
{ "version": "0.2.0", "configurations": [ { "name": "Python: Current File", "type": "python", "request": "launch", "program": "${file}", "console": "integratedTerminal", "cwd": "${workspaceFolder}", "env": {"PYTHONPATH": "${workspaceFolder}/src"} } ] }
配置完成后,在performance.py中直接使用from sorting.bubble_sort import bubble_sort即可正常运行。
方案2:以模块方式运行脚本(适配命令行运行场景)
不需要修改任何配置,只要在**项目根目录(MyProject文件夹)**下执行以下命令即可:
python -m src.benchmark.performance
这种运行方式会自动将当前工作目录加入模块搜索路径,同时将performance.py识别为包内模块,绝对导入from sorting.bubble_sort import bubble_sort和相对导入from ..sorting.bubble_sort import bubble_sort都可正常生效。
方案3:安装项目为可编辑包(适配所有运行场景,长期开发推荐)
在项目根目录新建pyproject.toml文件,填写以下内容:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "my-sorting-project" version = "0.1.0" packages = ["src"]
之后在项目根目录执行安装命令:
pip install -e .
安装完成后,无论你用哪种方式运行performance.py,都可以直接用from sorting.bubble_sort import bubble_sort完成导入,无需额外调整路径配置。
内容的提问来源于stack exchange,提问作者Youssef13
相关产品推荐
相关产品推荐

