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内容
subpackage1/__init__.py:
from .script1 import * # 也可以显式指定导出内容:__all__ = ["add"]
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
相关产品推荐
相关产品推荐

