【问题标题】:Get versions of a .txt list of packages using pip.main使用 pip.main 获取 .txt 包列表的版本
【发布时间】:2020-11-16 05:12:34
【问题描述】:

我正在尝试遍历文本文件中的包列表以获取每个包的版本。 pkgs.txt 文件中的列表如下所示:

{
"package1",
"package2",
...
}

这是我最近的代码:

with open("pkgs.txt", "r") as pkgs:
    for line in pkgs:
        version = subprocess.check_call([sys.executable, '-m', 'pip', 'search', line])

with open("versions.txt", "w+") as versions:
    for ver in version:
        version.write(ver)

我得到的错误是:CalledProcessError: Command '['/opt/conda/bin/python', '-m', 'pip, 'search', '{\n']' returned non-zero exit status 23.

问题可能是我首先需要删除引号和逗号才能循环浏览此列表吗?

【问题讨论】:

  • 没有pip.mainpip doesn't have an API,应该做subprocess.check_call([sys.executable, '-m', 'pip', 'search', line])之类的事情。
  • pip.main 似乎在我手动输入包名称时起作用。我只是想找出如何从现有文件中获取名称。
  • 我知道你可能有一个旧版本的 pip,而 pip.main 仍然存在。无论您拥有什么版本的 pip,该建议仍然有效。 ——其余的,我没有仔细看,似乎很简单。你到底在坚持什么?
  • 谢谢,我已经尝试了子进程代码,但我收到错误“返回非零退出状态 23”。也许我的代码有问题,但我不确定,因为我对 python 还是很陌生。
  • 这能回答你的问题吗? How to specify install order for python pip?

标签: python-3.x csv pip


【解决方案1】:

(这个问题涉及的方面太多,无法一次全部涵盖。我将尝试在这里涵盖初始点,其余部分应在新问题中提出。)

首先,pip 没有 API。在您自己的程序中使用 pip 的首选方式是直接将其作为 子进程 调用。

输入格式无法识别(不是 CSV、JSON,也许 YAML 可以覆盖它)。但巧合的是,输入格式作为文字 Python 字符串列表在某种程度上是可读的,因此可以尝试使用 ast.literal_eval 解析内容。

pkgs.txt:

{
"package1",
"package2",
}

main.py

#!/usr/bin/env python3

import ast
import pathlib
import subprocess
import sys

def main():
    file_name = 'pkgs.txt'
    file_path = pathlib.Path(file_name)
    file_content = file_path.read_text()
    pkgs = ast.literal_eval(file_content)
    print("pkgs", pkgs)
    for pkg in pkgs:
        print("pkg", pkg)
        command = [
            sys.executable,
            '-m',
            'pip',
            'search',
            pkg,
        ]
        print("command", command)
        command_output = subprocess.check_output(command)
        print("command_output")
        print('"""')
        print(command_output.decode())
        print('"""')

if __name__ == '__main__':
    main()

command_result 中提取正确信息可以在后续问题中处理。 (我怀疑在这里调用pip search 不是最好的选择,可能值得直接使用PyPI's APIs 之一。)

command_output
"""
package2 (0.0.0)                      - 
101703383-python-package2 (0.0.3)     - This is my second package in python.
Vigenere-cipher-package2 (0.5)        - An example of Vigenere cipher
WuFeiLiuGuang-first-package2 (2.0.0)  - test pkg ignore

"""

参考文献

【讨论】:

  • 谢谢你,我会试试看。道歉,因为这可能是一个基本问题,但我该怎么处理 main.py?我需要创建这个文件吗?
  • 是的,在pkgs.txt的同一目录下创建一个main.py文件并运行python3 main.py
猜你喜欢
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 2012-02-11
  • 2023-02-10
  • 2020-11-07
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多