无需安装即可获取 pip 依赖版本?

问题描述 投票:0回答:3

当您告诉 pip 同时安装多个包时,它会查找所有子依赖项并安装所有父包限制允许的最新版本。

例如,如果 packageA 需要 child>=0.9 并且 packageB 需要 child<=1.1, then pip will install child==1.1.

我正在尝试编写一个脚本来扫描

requirements.txt
并固定所有未列出的子包版本。

一种方法是通过

requirements.txt
安装
pip install -r requirements.txt
文件中的所有内容,然后解析
pip freeze
的输出,并从我的
requirements.txt
文件中删除所有包。剩下的一切都应该是子包和 pip 计算出的最高版本号。

但是,这需要创建 Python 虚拟环境并安装所有包,这可能需要一些时间。 pip 中是否有任何选项可以在不实际安装软件包的情况下进行版本计算?如果没有,是否有类似 pip 的工具可以提供此功能?

python pip
3个回答
0
投票

您可以使用 json 模块阅读 PyPI 托管包的包要求:

python3 终端/脚本:

import csv
import json
import requests

your_package = str('packageA')
pypi_url = 'https://pypi.python.org/pypi/' + your_package + '/json'
data = requests.get(pypi_url).json()

reqs = data['info']['requires_dist']
print(reqs)
print('Writing requirements for ' + your_package + ' to requirements.csv')
f = open('requirements.csv', 'w')
w = csv.writer(f, delimiter = ',')
w.writerows([x.split(',') for x in reqs])
f.close()

0
投票

如果我正确地理解了您的问题,您正在尝试安装软件包的特定版本,一种方法是在您的requirement.txt 文件中指定版本后,可以使用 pip install 然后依赖项加上版本 示例 pip install WhatsApp v3.5


0
投票

pip
有一个 --dry-run 选项,告诉您在给定一组特定要求的情况下它会安装什么,无论是在命令行中列出还是通过 requirements.txt
 选项作为 
-r
 文件传入。由于听起来您想要生成完整的依赖项列表,因此您还可以使用 
--ignore-installed
 来忽略您已有的任何依赖项。或者,您可以创建一个空的 virtualenv 并在其中进行试运行。由于您实际上不会在其中安装任何东西,所以应该不会那么耗时。

还有一个

--report

 选项,可让您输出已安装内容(或在试运行情况下)的结构化 JSON 报告。 
here 描述了该输出文件的格式。遗憾的是,它不会输出 requirements.txt
 格式的文件,但由于 JSON 输出结构良好,因此可以轻松可靠地从中生成 
requirements.txt
 文件。您可以使用 
jq
 或其他 JSON 解析工具来生成它。例如...

python3 -m pip install --ignore-installed --dry-run -r requirements.txt --report installed.json jq '.install[] | .metadata.name + "==" + .metadata.version' -r
这将输出一个需求文件,就像 pip freeze 一样,所有需求都与特定版本挂钩。如果您不想使用 

jq

,您甚至可以使用内置 
json
 模块在 Python 中编写一个小脚本,将该报告文件更改为 
requirements.txt
 文件。无论哪种情况,您最终都会获得所需的每个依赖项的完整、固定版本列表,而无需实际安装任何内容。

© www.soinside.com 2019 - 2024. All rights reserved.