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
相关产品推荐
相关产品推荐

