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

Python同目录层级子模块间相互导入函数的问题及解决方案问询

Python跨子包导入错误原因与解决方案

核心错误原因

你遇到的报错本质是Python各模块的全局命名空间相互独立:你在subpackage2/__init__.py中导入的add函数,仅存在于subpackage2.__init__模块的命名空间内,不会自动注入到同目录下script2.py的命名空间,因此script2.py执行时找不到add变量。

此外你还存在几处配置错误:

  • subpackage1/__init__.py中的from .subpackage1 import *是无效语句:当前__init__.py本身就在subpackage1目录下,.代表当前目录,不存在名为subpackage1的子模块,正确写法应为导入同目录的script1:from .script1 import *
  • subpackage2/__init__.py中的from .subpackage2 import *同理无效,当前目录无subpackage2子模块
  • 测试代码中的from package_name.subpackage2 import add_1无法匹配你定义的函数名,要么导入add_extended,要么你需要在subpackage2/__init__.py中配置别名

实现预期效果的调整方案

如果你希望减少子模块中的重复导入语句,统一在__init__.py维护跨包依赖,可按如下配置:

步骤1:修正各__init__.py内容

  1. subpackage1/__init__.py:
from .script1 import *
# 也可以显式指定导出内容:__all__ = ["add"]
  1. subpackage2/__init__.py:
from ..subpackage1 import add
from .script2 import add_extended
# 上层可直接从subpackage2导入这两个对象:__all__ = ["add", "add_extended"]

步骤2:在script2.py中引入同包__init__的导入内容

只需要加一行导入,不需要写完整的跨子包相对路径,后续依赖修改仅调整__init__.py即可:

from . import add

def add_extended(a, b):
    return add(a,b) + a

步骤3:修正测试代码

确保测试代码运行时project_folder在Python的模块搜索路径中,测试代码调整为:

from package_name.subpackage2 import add_extended

a, b = 2, 4
print(add_extended(a,b)) # 输出 8

规范说明

实际上Python社区的标准实践是将模块的所有依赖导入直接写在模块顶部,这种写法可读性更高,其他开发者不需要跳转__init__.py就能清晰看到依赖来源,反而你预期的透传写法会降低代码可维护性,建议优先选择直接在script2.py头部写跨子包导入的方案。

内容的提问来源于stack exchange,提问作者André Lourenço

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:15:08