用于pip冻结的subprocess.popen不返回软件包列表

时间:2018-11-30 15:44:58

标签: python

我的代码似乎一直在工作,但是现在我只是收到标准输出说,

You are using pip version 9.0.1, however version 18.1 is available.

You should consider upgrading via the 'python -m pip install --upgrade pip' command.

这是我的代码

import subprocess
proc = subprocess.Popen(['pip', 'freeze'], stdout=subprocess.PIPE,
                        stderr=subprocess.STDOUT)

output, err = proc.communicate()
string_file = StringIO.StringIO(output)
print string_file.readlines()

我的目标是获取几个不同软件包的版本号,如果该版本号与我先前在json文件中为该软件包的版本记录的版本号不同,请执行一些操作。点子列表的子过程似乎也无济于事。

有人知道什么可能导致此行为,或者是否有更简单的方法让我执行此操作?我有大约10个包裹要检查。

2 个答案:

答案 0 :(得分:1)

显而易见的事情是听取pip的建议并对其进行更新。如果您无法执行此操作,则错误消息应该是无害的-pip执行的检查通常不会使其停止工作。

您可以使用禁用版本检查

proc = subprocess.Popen(['pip', 'freeze', '--disable-pip-version-check'],
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT)

答案 1 :(得分:0)

我正在使用pkg_resources模块来获取以下信息:

import pkg_resources
from subprocess import call

# If you want to skip some packages
exception = ['scipy', 'numpy']

# List comprehension to get the packages
pack_names = [d for d in pkg_resources.working_set
    if d.project_name not in exception]

# print the package names and versions
for dist in pack_names:
    print('PACKAGE: {}'.format(dist))
    # And if you want to upgrade this package:
    call('pip install --upgrade --no-cache-dir ' + dist.project_name, shell=True)

希望这会有所帮助。