如何在setup.py中添加自定义wheel文件作为依赖?
问题解答
首先直接给结论:你当前的写法完全不可行,而且MANIFEST.in也帮不上这个忙,下面给你详细解释原因和靠谱的替代方案:
为什么你的尝试行不通?
- 把
'library.whl'直接放进install_requires里,pip会把它当成一个PyPI上的包名去搜索,而不是本地的wheel文件,安装时肯定会报错找不到这个包。 - MANIFEST.in的作用是告诉setuptools在打包你的项目时,要包含哪些额外的文件(比如文档、配置、或者你说的这个wheel),但它完全不负责处理依赖的安装逻辑——也就是说,就算你把wheel放进MANIFEST.in,pip安装你的项目时也不会自动去安装这个wheel文件。
推荐的解决方案
下面分几种场景给你最实用的方案,都能实现「单次pip install完成所有安装」的需求:
场景1:wheel文件可以通过远程URL访问(比如作者放在GitHub Release、私有服务器上)
如果这个wheel有公开/可访问的下载链接,直接用PEP 508定义的URL依赖语法就行,pip 19.0及以上版本都支持:
install_requires=[ # 远程URL示例 'library @ https://example.com/path/to/library.whl', # 本地绝对路径示例(仅自己开发调试用) # 'library @ file:///absolute/path/to/library.whl', 'matplotlib==2.2.2', 'numpy==1.14.2', 'opencv-python==3.4.0.12', 'Pillow==5.1.0', 'PyYAML==3.12', ],
这种方式最简洁,pip会自动下载并安装这个wheel,同时处理好依赖关系。
场景2:wheel文件需要和你的项目一起分发(比如你要把自己的项目打包给别人,附带这个依赖wheel)
这种情况需要两步配合:
- 用MANIFEST.in包含wheel文件:在项目根目录创建
MANIFEST.in,加入一行:
include deps/library.whl
(假设你把wheel放在项目的deps文件夹里,路径可以根据你的实际结构调整)
- 在setup.py里动态生成本地文件URL:因为安装时的路径不确定,我们可以用代码生成wheel的绝对路径:
import os def get_local_wheel_path(): # 获取当前setup.py所在目录的绝对路径 setup_dir = os.path.abspath(os.path.dirname(__file__)) # 拼接wheel文件的路径 return os.path.join(setup_dir, 'deps', 'library.whl') install_requires=[ f'library @ file:///{get_local_wheel_path()}', 'matplotlib==2.2.2', 'numpy==1.14.2', 'opencv-python==3.4.0.12', 'Pillow==5.1.0', 'PyYAML==3.12', ],
这样不管用户是从源码包安装,还是从你打包好的wheel安装,pip都能找到这个依赖文件并安装。
场景3:长期规范方案——私有PyPI仓库
如果这个依赖是你团队内部或者长期使用的,最规范的做法是把这个wheel上传到私有PyPI仓库(比如用devpi、或者公司内部的PyPI服务),然后在install_requires里直接写包名和版本(如果有的话),就像其他PyPI依赖一样。这种方式维护起来最方便,也完全符合pip的依赖管理逻辑。
额外提醒
别再用已经被弃用的dependency_links参数——这个参数在新版setuptools和pip里已经不再支持了,尝试用它只会踩更多坑。
内容的提问来源于stack exchange,提问作者JustinBlaber
相关产品推荐
相关产品推荐

