You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

这种情况需要两步配合:

  1. 用MANIFEST.in包含wheel文件:在项目根目录创建MANIFEST.in,加入一行:
include deps/library.whl

(假设你把wheel放在项目的deps文件夹里,路径可以根据你的实际结构调整)

  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:38:55