如何让pip递归搜索目录安装包及依赖?含场景与包格式疑问
关于pip递归搜索路径安装包及包类型的问题
1. pip默认不支持递归搜索文件系统路径
首先明确:pip的--find-links(简写-f)参数不会自动递归遍历子目录。你遇到的pip install packageA -f C:\packages\无效,正是因为pip只会检查C:\packages\目录下的文件,不会深入到packageA\1.0.0、packageB\2.2.1这类子目录里查找包文件。
要解决这个问题,有几个可行的方案:
方案一:指定所有包含包的子目录
把每个存放包文件的版本目录都加入--find-links,同时加上--no-index避免从PyPI下载:pip install packageA --no-index --find-links=C:\packages\packageA\1.0.0 --find-links=C:\packages\packageA\1.0.1这个方法直观但如果包版本多会比较繁琐。
方案二:生成本地索引页面
在C:\packages\目录下创建一个index.html文件,里面列出所有包文件的链接(不管是源码包还是二进制包),示例内容如下:<html> <body> <a href="packageA/1.0.0/packageA-1.0.0.tar.gz">packageA-1.0.0.tar.gz</a><br> <a href="packageA/1.0.1/packageA-1.0.1.tar.gz">packageA-1.0.1.tar.gz</a><br> <a href="packageB/2.2.1/packageB-2.2.1.whl">packageB-2.2.1.whl</a><br> <a href="packageB/2.2.4/packageB-2.2.4.whl">packageB-2.2.4.whl</a><br> </body> </html>之后运行命令:
pip install packageA --no-index --find-links=C:\packages\这时pip会读取
index.html里的链接,自动匹配合适的版本安装。方案三:直接安装指定版本的包文件
如果不需要自动选择版本,可以直接指向具体的包文件路径:pip install C:\packages\packageA\1.0.1\packageA-1.0.1.tar.gz
2. 源码包与二进制包都支持
不管是带有setup.py的纯Python源码包,还是二进制包(比如.whl格式),pip都完全支持安装:
- 纯源码包:pip会自动执行
setup.py完成编译(纯Python包无需编译)和安装,只要包的结构符合Python打包规范即可,不需要额外配置。 - 二进制包:安装速度更快,不需要本地编译环境,尤其适合带有C扩展的包。
内容的提问来源于stack exchange,提问作者supertommy




