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

Python含main函数模块的包导入问题求助

搞定Python模块导入报错:ImportError: No module named p2

嘿,我之前也踩过这个一模一样的坑!先得把你的项目目录理清楚,我猜大概率是两种常见情况之一,咱们一个个说:

第一种情况:p1、p2和main.py都在同一个文件夹里

比如你的项目结构是这样的:

你的项目文件夹/
├── main.py
├── p1.py
└── p2.py

这时候你在main.py里导入p1,然后p1里直接写import p2就会报错——原因是当你运行main.py时,Python的模块查找路径是基于main.py的位置,但p1里的导入如果不用相对路径的话,有时候会找不到同级的p2。

解决办法很简单,把p1.py里的导入改成:

# p1.py里的导入语句改成这个
from . import p2

不过要注意哦,如果你直接运行p1.py(比如python p1.py),这个写法会报错,因为直接运行的模块会被当成__main__,不能用相对导入,但如果是通过main.py来导入p1就完全没问题。

要是你想让p1.py不管是直接运行还是被导入都能用,那可以加几行代码把当前目录加入Python的查找路径:

# p1.py开头加上这些
import sys
from pathlib import Path
# 把当前文件所在的文件夹加到查找路径里
sys.path.append(str(Path(__file__).parent))
# 再导入p2
import p2

第二种情况:p1和p2是同一个子包里的文件

比如你的项目是带包结构的:

你的项目文件夹/
├── main.py
└── 自定义包名/
    ├── __init__.py  # 这个文件不能少,用来标识这是个Python包
    ├── p1.py
    └── p2.py

这时候main.py里得这么导入p1:

# main.py里的导入
from 自定义包名 import p1

然后p1.py里可以用相对导入:

# p1.py里的导入
from . import p2

或者用绝对导入,直接指定包名:

# p1.py里的导入
from 自定义包名 import p2

这样就不会报错啦。

为啥会出这个问题?

说白了就是Python找模块全靠sys.path这个列表,当你运行main.py时,main.py所在的文件夹会自动加到这个列表里,但如果p1是从子文件夹里被导入的,它自己的文件夹不会自动加进去。另外,主模块的名字永远是__main__,所以直接运行的模块没法用相对导入——因为相对导入是基于包结构的,直接运行的模块不属于任何包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:02:40