setup.py使用外部URL依赖跨平台安装失败:Ubuntu报404如何解决?
这个问题的核心原因很明确:你在Ubuntu 18.04上用的pip 9.0.1版本太老了,它不支持PEP 508规范里直接在install_requires中使用@ git+URL的依赖格式。当pip 9.0.1看到fons @ git+https://github.com/binares/fons.git时,它会忽略Git地址,直接去PyPI上找名为fons的包,找不到就抛出404错误;而Windows上的pip 19.3.1已经支持这个新格式,所以能正常安装。
下面给你三个可行的解决方案,你可以根据自己的需求选择:
方案一:升级Ubuntu上的pip版本(最简单推荐)
旧版pip的兼容性问题是根源,直接升级pip到支持PEP 508 Git依赖的版本就能解决问题。执行以下命令:
- 先升级pip(如果怕影响系统全局pip,加上
--user选项安装到用户目录):
pip3 install --user --upgrade pip
- 确保升级后的pip在PATH中(Ubuntu默认
~/.local/bin会在PATH里,如果没有的话可以手动添加),然后再安装你的包:
pip3 install wsclient-0.1.0.tar.gz
这样升级后的pip就能正确识别install_requires里的Git依赖格式,和Windows上的行为一致。
方案二:修改setup.py兼容旧版pip(不升级pip的情况下)
如果因为某些原因不能升级pip,可以修改setup.py,用旧版pip支持的dependency_links参数来声明Git依赖:
修改后的setup.py代码如下:
setup( ..., # 保留你原来的其他参数 install_requires=['fons'], dependency_links=[ # 注意#egg=后面的格式是包名-版本号,旧pip需要这个来识别依赖 'git+https://github.com/binares/fons.git#egg=fons-0.1.0' ] )
然后安装的时候需要加上--process-dependency-links选项,告诉旧pip去处理dependency_links里的链接:
pip3 install --process-dependency-links wsclient-0.1.0.tar.gz
⚠️ 注意:dependency_links在新版pip中已经被弃用,但新版pip仍然会兼容处理这个参数,所以修改后的setup.py在Windows的pip 19.3.1上也能正常工作。
方案三:手动提前安装Git依赖(临时应急方案)
如果不想修改代码也不想升级pip,可以先手动安装fons依赖,再安装你的包:
- 先安装fons:
pip3 install git+https://github.com/binares/fons.git
- 再安装wsclient:
pip3 install wsclient-0.1.0.tar.gz
这样pip在安装wsclient时,发现fons已经存在,就不会再去PyPI查找了。
内容的提问来源于stack exchange,提问作者binares

