Setuptools Python打包:src布局下模块导入异常求助
问题背景
项目结构:
src/ └── mypackage/ ├── __init__.py (空文件) ├── a.py └── mysubpackage1/ ├── __init__.py (空文件) └── b.py
已配置pyproject.toml:
[tool.setuptools.packages.find] where = ["src"] include = ["*"]
遇到的问题:
- 安装包后可导入
mypackage,但调用mypackage.a()时提示module 'mypackage' has no attribute 'a',希望导入mypackage后直接使用mypackage.a()。 - 目前只能通过
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中显式导入子包/子模块:
- 修改
src/mypackage/__init__.py,导入mysubpackage1:# src/mypackage/__init__.py from . import a from . import mysubpackage1 - 修改
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
相关产品推荐
相关产品推荐

