如何在Python中添加本地wheel包作为依赖构建独立安装包
解决本地依赖Wheel的Python包构建与自动安装问题
问题原因
你遇到的报错是因为install_requires仅支持符合PEP 508规范的依赖声明格式,直接填写本地文件路径不符合解析规则,因此触发语法错误。
解决方案
方法一:自定义安装命令(自动安装本地依赖)
该方案通过重写setuptools的安装命令,实现安装你的包前自动安装本地依赖Wheel,无需用户额外操作。
项目结构调整
在项目根目录创建wheels文件夹,将依赖的PROJECT_NAME-1.1.1-py3-none-any.whl放入其中。修改setup.py
添加自定义安装命令,同时确保本地依赖Wheel被打包进你的包中:
from setuptools import setup, find_packages from setuptools.command.install import install import subprocess import os # 保留你原有的CleanCommand定义 class CleanCommand(...): # 你的CleanCommand实现代码... class CustomInstallCommand(install): def run(self): # 先执行默认安装逻辑,将包文件(含依赖Wheel)复制到安装目录 super().run() # 获取安装后依赖Wheel的绝对路径 dep_wheel_path = os.path.join( self.install_lib, "my_package_name", "wheels", "PROJECT_NAME-1.1.1-py3-none-any.whl" ) # 安装本地依赖 subprocess.check_call([self.executable, "-m", "pip", "install", dep_wheel_path]) setup( name="my_package_name", version=version, author_email="my-name@my-asso.com", # 注意移除原代码中的多余逗号 description=description, long_description=long_description, long_description_content_type="text/markdown", url="...", python_requires=">=3.6.0", cmdclass={ "clean": CleanCommand, "install": CustomInstallCommand, # 绑定自定义安装命令 }, package_data={ "my_package_name": ["wheels/*.whl", "*.pkl", "*.json", "VERSION"], }, packages=find_packages(exclude=('tests', 'tests.*')), # 可移除install_requires中的PROJECT_NAME,避免重复安装检测 install_requires=[req for req in requirements if not req.startswith("PROJECT_NAME")], include_package_data=True, classifiers=[ "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: Implementation :: CPython", "Operating System :: OS Independent", "Topic :: Software Development :: Libraries" ], )
- 构建Wheel包
执行以下命令生成你的包:
python setup.py bdist_wheel
安装生成的Wheel时,会自动先安装附带的本地依赖。
方法二:配合pip的--find-links参数(轻量方案)
若无需完全自动,可通过以下方式让pip优先从本地获取依赖:
- 将你的包Wheel和依赖Wheel放在同一目录。
- 创建
requirements-local.txt文件,内容如下:
--find-links=. PROJECT_NAME==1.1.1
- 用户安装时执行:
pip install my_package_name-xxx.whl -r requirements-local.txt
pip会优先从当前目录查找依赖Wheel,不会触发网络下载。
内容的提问来源于stack exchange,提问作者Peleg
相关产品推荐
相关产品推荐

