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

Python跨目录导入类遇ModuleNotFoundError问题求助

解决ModuleNotFoundError: No module named 'dir1'的优雅方案

问题根源

当直接运行dir2/code1.py时,Python会将dir2目录加入sys.path,但PYFILES根目录不在搜索路径中——哪怕你已经添加了__init__.py,父目录不在搜索路径里也无法让Python识别同级的dir1包。

推荐解决方案

1. 以根目录为上下文运行脚本(最稳妥)

切换到PYFILES目录,用模块方式执行code1.py:

cd /path/to/PYFILES
python -m dir2.code1

这种方式会自动将PYFILES加入sys.path,Python就能正常识别dir1和dir2两个同级包,无需修改任何代码。

2. 使用相对导入(需配合模块运行)

修改code1.py的导入语句为相对路径:

from ..dir1.module1 import car

new_car = car()

⚠️ 注意:不能直接运行code1.py,必须回到PYFILES目录,用模块方式启动:

cd /path/to/PYFILES
python -m dir2.code1

直接运行脚本会触发ValueError: attempted relative import beyond top-level package错误,因为此时脚本被当作顶级模块,无法向上引用父目录的包。

3. 设置PYTHONPATH环境变量

通过环境变量告诉Python去哪里找你的包:

  • 临时生效(单次会话):
    Linux/macOS终端:
    export PYTHONPATH="/path/to/PYFILES"
    python /path/to/PYFILES/dir2/code1.py
    
    Windows CMD:
    set PYTHONPATH=C:\path\to\PYFILES
    python C:\path\to\PYFILES\dir2\code1.py
    
    Windows PowerShell:
    $env:PYTHONPATH = "C:\path\to\PYFILES"
    python C:\path\to\PYFILES\dir2\code1.py
    
  • 永久生效:
    将PYFILES的路径添加到系统的PYTHONPATH环境变量中,以后所有Python会话都会自动识别这个路径下的包。

为什么之前的__init__.py没效果?

__init__.py的作用是让目录被识别为Python包,但前提是这个包所在的父目录必须在Python的搜索路径(sys.path)里。你之前的问题核心是父目录PYFILES不在搜索路径中,所以光加__init__.py无法解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:28:18