如何在包安装时(通过pyproject.toml/setup.py)安装自定义库Wheel?
方案一:通过pyproject.toml配置(推荐,符合现代Python打包规范)
无需编写setup.py,完全通过pyproject.toml完成配置:
- 将自定义Whl包含到分发包:在pyproject.toml中添加数据文件配置,确保
data/library.whl被打包进你的example.whl:
[tool.setuptools.data-files] "data" = ["data/*.whl"]
- 配置依赖查找路径与依赖声明:在pyproject.toml的
[project]区块中,声明自定义依赖的名称,并指定查找路径为data/目录:
[project] name = "example" version = "0.1.0" dependencies = [ "numpy", "pandas", "library" # 填写自定义Whl对应的包名称(需和library.whl内部的包名一致) ] [tool.setuptools.find-links] file = ["data/"]
配置完成后,用户执行pip install example.whl时,pip会自动从包内的data/目录找到library.whl并安装,再依次处理其他依赖和主包。
方案二:通过setup.py自定义安装流程
如果需要更灵活的安装控制,可以重写setuptools的安装命令:
- 编写setup.py:
from setuptools import setup, find_packages from setuptools.command.install import install import subprocess import os import sys class CustomInstallCommand(install): def run(self): # 优先安装自定义依赖Whl whl_full_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data", "library.whl") # 使用当前Python环境的pip执行安装,避免环境冲突 subprocess.check_call([sys.executable, "-m", "pip", "install", whl_full_path]) # 执行默认安装流程 super().run() setup( name="example", version="0.1.0", packages=find_packages(), install_requires=["numpy", "pandas"], cmdclass={"install": CustomInstallCommand}, # 确保data目录下的Whl被打包进分发包 data_files=[("data", ["data/library.whl"])] )
- 打包主包:执行
python -m build生成example.whl,此时data/library.whl会被包含在包内。用户安装时,自定义命令会先自动安装library.whl,再完成主包的安装。
注意事项
- 确保自定义Whl的包名称(即
library)和你在依赖声明中写的一致,可通过解压Whl查看内部METADATA文件确认。 - 方案一中的
find-links配置需要setuptools 61.0.0及以上版本支持,若环境版本较低,建议先升级setuptools。
内容的提问来源于stack exchange,提问作者KevDa06
相关产品推荐
相关产品推荐

