Python项目中如何从子文件夹calculate导入模块到dosomething?
Python跨模块导入报错的解决方法
项目结构
my_proj(主文件夹) - __init__.py - dosomething(模块A) - __init__.py - test.py - calculate(模块B) - __init__.py - add_num.py
现有代码
calculate/add_num.py
def my_add_num(a, b): return a + b
calculate/init.py
from .add_num import my_add_num
dosomething/test.py(报错的尝试)
# 尝试1:相对导入报错 # from ..calculate import my_add_num # ImportError: attempted relative import with no known parent package # 尝试2:直接导入模块报错(注:原代码函数名/模块名拼写错误,应为my_add_num、add_num) # from calculate.add_two_num import my_add_two_num # No module named 'calculate' # 尝试3:绝对导入主模块报错 # from my_proj.calculate import my_add_num # No module named 'my_proj' print(my_add_num(100,300))
修正方案
方案1:手动添加模块搜索路径(最简方案)
在test.py开头添加代码,将my_proj目录加入Python的模块搜索路径:
import sys import os # 获取my_proj的绝对路径并添加到sys.path sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # 此时可直接导入calculate模块 from calculate import my_add_num print(my_add_num(100, 300))
方案2:以包的形式运行脚本
不修改代码,在my_proj的父目录下执行以下命令运行脚本:
python -m my_proj.dosomething.test
同时将test.py改为相对导入的写法:
from ..calculate import my_add_num print(my_add_num(100, 300))
这种方式会让Python将my_proj识别为一个包,从而支持相对导入。
方案3:安装为可编辑包(适合长期开发)
在my_proj目录下创建setup.py文件:
from setuptools import setup, find_packages setup( name="my_proj", version="0.1", packages=find_packages() )
然后在my_proj目录下运行:
pip install -e .
安装完成后,即可在test.py中直接使用绝对导入:
from my_proj.calculate import my_add_num print(my_add_num(100, 300))
报错原因
- 相对导入失败:直接运行
test.py时,Python将其视为独立脚本,而非包的一部分,无法解析相对导入的父包。 - 直接导入模块失败:
my_proj不在Python的默认模块搜索路径中,导致找不到calculate模块。 - 绝对导入主模块失败:同理,
my_proj未被Python识别为可导入的模块,因为其路径不在搜索列表内。
内容的提问来源于stack exchange,提问作者4daJKong
相关产品推荐
相关产品推荐

