Python包跨文件夹导入文件报错,求非sys库解决方案
问题分析与解决
问题背景
项目结构
pythonProject | |-__init__.py | |- a | |- file_a.py | |-__init__.py | |- b |- file_b.py |-__init__.py
相关代码
file_a.py
class class_a: def __init__(self): pass def show(self): print('class A') if __name__ == "__main__": pass
file_b.py(初始版本)
from pythonProject.a.file_a import class_a class class_b: def __init__(self): pass def show(self): a = class_a() a.show() if __name__ == "__main__": b = class_b()
报错情况
在pythonProject目录下执行python b/file_b.py时,出现No module named 'pythonProject';尝试相对导入、简化导入路径均报错。
错误原因
- 直接运行子脚本的问题:执行
python b/file_b.py时,Python会把b/目录当成脚本的运行根目录,pythonProject不会被识别为一个包,自然找不到pythonProject或a这些模块。 - 相对导入的限制:相对导入
from ..a...只在模块被作为包的一部分导入时生效,直接运行脚本的话,Python无法识别它的父包结构,所以报错。 - 空
__init__.py没问题:空的__init__.py已经能标记目录为Python包,不需要添加任何额外内容,这不是问题所在。
解决方法(无需修改sys.path)
方案1:用模块方式运行脚本
在pythonProject目录下执行:
python -m b.file_b
同时把file_b.py的导入语句改成:
from a.file_a import class_a
-m参数会让Python把当前pythonProject目录加入模块搜索路径,a和b作为同级包就能被互相识别。
如果想保留from pythonProject.a.file_a import class_a的导入语句,需要到pythonProject的父目录下执行:
python -m pythonProject.b.file_b
方案2:新增项目入口文件
在pythonProject目录下创建main.py:
from b.file_b import class_b if __name__ == "__main__": b = class_b() b.show()
把file_b.py的导入语句改成from a.file_a import class_a,然后在pythonProject目录下执行:
python main.py
这种方式把入口放在项目根目录,Python会自动把根目录加入搜索路径,子包之间的导入就能正常工作。
内容的提问来源于stack exchange,提问作者ayo
相关产品推荐
相关产品推荐

