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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:37:48