如何让自研Python包同时兼容Conda环境与标准Python打包工具?
兼容Conda与pip的Python包开发方案
核心思路:用pyproject.toml统一管理依赖,配合Conda构建配置实现双兼容
1. 用pyproject.toml定义基础依赖(适配pip)
遵循PEP 621规范,在pyproject.toml中统一声明包的核心依赖、可选依赖等,确保pip安装时可直接读取:
[project] name = "your-package-name" version = "0.1.0" dependencies = [ "numpy>=1.21", "scipy>=1.7", # 其他通用依赖 ] [project.optional-dependencies] dev = [ "pytest>=7.0", "black>=23.0" ]
执行pip install .或上传PyPI后,pip可正常识别并处理依赖。
2. 为Conda安装准备构建配置(meta.yaml)
要让Conda能安装你的包,需编写conda-build专用的meta.yaml,通过Jinja2语法导入pyproject.toml内容,避免重复维护依赖:
- 创建
conda-recipe/meta.yaml文件:
package: name: your-package-name version: "{{ load_file('../pyproject.toml')['project']['version'] }}" source: path: .. build: noarch: python script: "{{ PYTHON }} -m pip install . -vv" requirements: host: - python >=3.8 - pip run: - python >=3.8 {% for dep in load_file('../pyproject.toml')['project']['dependencies'] %} - {{ dep }} {% endfor %} test: imports: - your_package_name requires: {% for dep in load_file('../pyproject.toml')['project']['optional-dependencies']['dev'] %} - {{ dep }} {% endfor %} commands: - pytest tests/
修改pyproject.toml的依赖后,meta.yaml会自动同步,无需手动维护两份配置。
3. 本地Conda安装与测试
- 先用conda-build构建包:
conda build conda-recipe
- 构建完成后,安装本地包:
conda install -c local your-package-name
Conda会自动处理依赖冲突,确保与已安装的Conda包兼容。
4. 简化维护的额外技巧
- 用
pip-tools从pyproject.toml生成requirements.txt(适配传统pip场景):
pip install pip-tools pip-compile pyproject.toml
生成的requirements.txt可直接给pip使用,无需手动编写。
- 优先选择Conda和pip双端支持的包;若必须使用Conda专属包,可在
meta.yaml的run依赖中额外添加,同时在pyproject.toml中用环境标记说明(例如"mypackage; sys_platform == 'linux'")。
注意事项
- 弃用已停止维护的
conda develop,改用上述conda build+本地安装的方式,完全支持Python 3.11及以上版本。 - 若需上传至conda-forge,仅需基于上述
meta.yaml做少量调整即可。
内容的提问来源于stack exchange,提问作者Drphoton
相关产品推荐
相关产品推荐

