能否实现同一Python包下多子项目(如mycompany.parser)单独安装?
完全可以实现,用Python的可选依赖机制就行
你只需要把这些子模块(mycompany.parser、mycompany.database)放在同一个主包mycompany下,然后通过配置可选依赖组,让用户可以按需安装对应的功能。
1. 项目结构参考
先把代码组织成嵌套包的结构:
mycompany/ __init__.py # 可以是空文件,或者按需导出子模块内容 parser/ __init__.py # 你的parser相关代码文件 database/ __init__.py # 你的database相关代码文件 pyproject.toml # 核心配置文件
2. 配置可选依赖
现在推荐用pyproject.toml来配置(替代旧的setup.py/setup.cfg),示例配置如下:
[project] name = "mycompany" version = "0.1.0" # 自动发现所有子包 packages = ["mycompany", "mycompany.parser", "mycompany.database"] # 定义可选依赖组 [project.optional-dependencies] # 如果parser模块有额外依赖,写在这里;没有的话可以留空 parser = ["requests>=2.25.0"] # database模块的额外依赖 database = ["sqlalchemy>=2.0.0"] # 一键安装所有功能的组 all = ["mycompany[parser,database]"]
如果你的子模块不需要额外第三方依赖,可选依赖组可以写成空的:
[project.optional-dependencies] parser = [] database = [] all = ["mycompany[parser,database]"]
3. 用户的安装方式
用户可以根据需求选择安装:
- 仅安装
mycompany.parser功能:pip install mycompany[parser] - 仅安装
mycompany.database功能:pip install mycompany[database] - 安装全部功能:
pip install mycompany[all] # 或者直接指定多个组 pip install mycompany[parser,database]
额外说明
- 主包
mycompany本身会被默认安装,用户安装任意可选组后,都能直接导入对应的子模块(比如import mycompany.parser)。 - 如果用旧的配置方式(setup.cfg),也可以通过
options.extras_require字段来定义这些可选组,逻辑是一样的。
内容的提问来源于stack exchange,提问作者Number47
相关产品推荐
相关产品推荐

