如何在pip依赖文件中通过相对路径引用私有WHL包(无需公开发布)
我最近碰到了一模一样的需求:已经生成了私有项目的WHL包,想在另一个Python项目里直接复用,又不想把包公开发布到PyPI,需要在requirements依赖文件里用相对路径来引用这个包。翻了pip文档也没找到直接说明,踩了好几个坑之后终于搞定了,分享一下过程:
我试过的错误写法及问题
写法1:用 editable 模式引用WHL文件
-e file: ./folder/my-project-0.1.0-cp36-cp36m-linux_x86_64.whl#egg=my-project==0.1.0报错:
NotADirectoryError: [Errno 20] Not a directory
原因:-e(可编辑模式)是针对源码目录设计的,根本不能用来引用WHL这种预编译的包文件。写法2:带file协议但路径前加了空格
file: ./folder/my-project-0.1.0-cp36-cp36m-linux_x86_64.whl#egg=my-project==0.1.0报错:
FileNotFoundError: [Errno 2] No such file or directory: '/folder/my-project-0.1.0-cp36-cp36m-linux_x86_64.whl'
原因:file:后面多了个空格,pip会把路径当成绝对路径从根目录开始找,完全忽略了相对路径的设定。写法3:直接写相对路径
folder/my-project-0.1.0-cp36-cp36m-linux_x86_64.whl报错:
Invalid requirement: 'folder/my-project-0.1.0-cp36-cp36m-linux_x86_64.whl' It looks like a path. Does it exist?
原因:pip会把这种纯路径格式判定为无效的依赖声明,必须明确用file协议来标识这是本地文件路径。
最终成功的写法
在requirements文件里,用无空格的file协议+相对路径,同时带上egg信息指定包名和版本,和其他PyPI包放在一起就行:
numpy pandas file:./folder/my-project-0.1.0-cp36-cp36m-linux_x86_64.whl#egg=my-project==0.1.0
这样pip就能正确识别相对路径,从当前requirements文件所在目录出发找到对应的WHL包并完成安装。
内容的提问来源于stack exchange,提问作者Marco Borges

