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

如何正确导入Python文件?解决多级目录结构下模块导入报错问题

解决Python跨子包导入问题

首先先提一下你目录里的小笔误:part2下的__init.py应该改成__init__.py,否则Python不会把part2识别为合法的子包,这是解决问题的前提哦。

接下来分析你两种导入方式失败的原因:

方式1报错原因

from training.part2.b import b 报错找不到training模块,是因为Python的模块搜索路径(sys.path)里没有包含training所在的父目录。当你直接运行a.py时,Python会把a.py所在的part1目录加入sys.path,而training目录不在这个路径里,所以无法被识别为可导入的模块。

方式2报错原因

from ..part2.b import b 属于相对导入,这种导入方式只能在作为包一部分被导入的模块里使用,而不能用于直接作为脚本运行的模块。当你直接执行a.py时,它被视为"顶层脚本",没有已知的父包上下文,所以相对导入会触发错误。


可行的解决方案

方案1:通过模块方式运行脚本

假设你的完整目录结构如下(补全上层目录,比如叫my_project):

my_project/
└── training/
    ├── part1/
    │   ├── __init__.py
    │   └── a.py
    └── part2/
        ├── __init__.py  # 已修正文件名
        └── b.py

打开终端,进入my_project目录,然后用以下命令运行a.py:

python -m training.part1.a

这种方式会把training当作一个完整的包来加载,此时a.py作为包的一部分,就可以正常使用相对导入:

# a.py 中的代码
from ..part2.b import b

方案2:手动添加父目录到sys.path

如果你习惯直接运行a.py,可以在a.py的最开头添加代码,把training目录所在的路径手动加入Python的搜索路径:

# a.py 开头添加
import sys
import os

# 获取当前文件所在目录的父目录(即training目录)
parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.append(parent_dir)

# 现在可以使用绝对导入
from part2.b import b
# 或者 from training.part2.b import b 也可以正常工作

修改后直接运行a.py就不会再报错了。

方案3:设置PYTHONPATH环境变量

你也可以把training所在的父目录(比如my_project)添加到PYTHONPATH环境变量中,让Python自动把这个目录加入模块搜索路径:

  • Linux/macOS终端:
    export PYTHONPATH="/path/to/my_project:$PYTHONPATH"
    
  • Windows命令行:
    set PYTHONPATH=C:\path\to\my_project;%PYTHONPATH%
    

设置后,不管你在哪个目录运行脚本,都可以直接使用from training.part2.b import b这种绝对导入方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 12:37:43