You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨目录导入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 包规范配置,安装到当前环境后就可以在任意位置导入:

  1. 在 app1 同级目录新增 pyproject.toml 配置文件,填入基础配置:
    [build-system]
    requires = ["setuptools>=61.0"]
    build-backend = "setuptools.build_meta"
    
    [project]
    name = "app1"
    version = "0.1.0"
    packages = ["app1"]
    
  2. 在 app1 目录下新增空的 __init__.py 文件标识为 Python 包
  3. 把 app1/main.py 里的导入语句改为 from app1.pkgs import * 符合绝对导入规范
  4. 终端执行 pip install -e . 安装到当前环境,之后无论在哪都可以直接用 from app1.main import main 导入,不需要再调整路径。

内容的提问来源于stack exchange,提问作者Sadra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:57:03