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

Setuptools Python打包:src布局下模块导入异常求助

问题背景

项目结构:

src/  
└── mypackage/  
    ├── __init__.py     (空文件)
    ├── a.py  
    └── mysubpackage1/  
        ├── __init__.py (空文件)  
        └── b.py   

已配置pyproject.toml:

[tool.setuptools.packages.find]
where = ["src"]
include = ["*"]

遇到的问题:

  1. 安装包后可导入mypackage,但调用mypackage.a()时提示module 'mypackage' has no attribute 'a',希望导入mypackage后直接使用mypackage.a()。
  2. 目前只能通过from mypackage.mysubpackage1 import b导入子模块,希望实现导入mypackage后,能以如下方式调用子包方法:
    import mypackage
    mypackage.mysubpackage1.b.foo()
    

之前尝试在__init__.py中添加from . import *或from .mypackage import *无效。


解决方案

问题1:实现mypackage.a()直接调用

Python导入包时仅默认加载包的__init__.py,不会自动导入同级模块。要让mypackage直接拥有a属性,需在src/mypackage/__init__.py中显式导入a模块:

# src/mypackage/__init__.py
from . import a

如果想把a.py中的函数/类直接暴露到包层级(比如a.py里有def bar(): ...,想直接用mypackage.bar()),可改为:

# src/mypackage/__init__.py
from .a import *

问题2:支持mypackage.mysubpackage1.b.foo()调用

需要在各级__init__.py中显式导入子包/子模块:

  1. 修改src/mypackage/__init__.py,导入mysubpackage1:
    # src/mypackage/__init__.py
    from . import a
    from . import mysubpackage1
    
  2. 修改src/mypackage/mysubpackage1/__init__.py,导入b模块:
    # src/mypackage/mysubpackage1/__init__.py
    from . import b
    

完成后,执行import mypackage时,Python会依次加载这些导入语句,将mysubpackage1和b挂载到对应层级,即可直接调用目标方法。


补充说明

  • from . import *无效的原因是:Python默认不会将同级模块纳入__all__列表,*导入仅会加载__all__中指定的内容。若想用*,需在__init__.py中定义__all__,比如:
    # src/mypackage/__init__.py
    __all__ = ["a", "mysubpackage1"]
    from . import *
    
    但显式导入的方式更清晰,避免隐式依赖。
  • 你的pyproject.toml配置正确,已能识别src下的包,无需修改。

内容的提问来源于stack exchange,提问作者Neeliy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:35:00