跨目录导入Python文件触发ModuleNotFoundError错误求解
问题原因
Python 加载模块时会优先搜索 sys.path 中存储的路径,你在 app2 目录下运行 script.py 时,sys.path 默认不包含 app1 的根目录路径。此时main.py 中的 from pkgs import * 语句会在 script.py 所在目录、Python 内置库目录等路径下搜索 pkgs,找不到就会抛出 ModuleNotFoundError。
解决方案
下面按适用场景从临时测试到长期工程化排序:
1. 临时添加路径到 sys.path(适合小项目/快速测试)
直接在 app2/script.py 最开头,把 app1 的根目录动态加入搜索路径即可,不需要修改原有 app1 的代码,对 main.py 单独运行的逻辑也没有影响:
import sys from pathlib import Path # 计算 app1 目录的绝对路径,适配不同设备、不同运行位置 # 假设 app1 和 app2 是同级目录,按你的实际层级调整即可 app1_path = str(Path(__file__).parent.parent / "app1") if app1_path not in sys.path: sys.path.append(app1_path) # 再导入 main 就可以正常运行了 from main import main if __name__ == "__main__": main()
2. 运行时指定 PYTHONPATH 环境变量
不需要修改任何代码,执行脚本时临时指定搜索路径即可:
- Linux/Mac 终端执行:
PYTHONPATH=/你的实际路径/app1 python app2/script.py - Windows cmd 执行:
set PYTHONPATH=C:\你的实际路径\app1 && python app2/script.py - Windows PowerShell 执行:
$env:PYTHONPATH="C:\你的实际路径\app1"; python app2/script.py
3. 打包为可安装包(适合长期维护的项目)
如果你的项目需要长期维护,推荐按照 Python 包规范配置,安装到当前环境后就可以在任意位置导入:
- 在
app1同级目录新增pyproject.toml配置文件,填入基础配置:[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "app1" version = "0.1.0" packages = ["app1"] - 在
app1目录下新增空的__init__.py文件标识为 Python 包 - 把
app1/main.py里的导入语句改为from app1.pkgs import *符合绝对导入规范 - 终端执行
pip install -e .安装到当前环境,之后无论在哪都可以直接用from app1.main import main导入,不需要再调整路径。
内容的提问来源于stack exchange,提问作者Sadra
相关产品推荐
相关产品推荐

