Python pip冻结的subprocess.popen不是';t退回包裹清单

Python pip冻结的subprocess.popen不是';t退回包裹清单,python,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'], s

我的代码似乎一直在工作,但现在我只是收到一条短信说

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文件中记录的软件包版本号不同,则执行一些操作。pip列表的子进程似乎也没有帮助


有没有人知道是什么原因导致了这种行为,或者是否有更简单的方法让我执行这种行为?我有大约10个包裹要托运

显然要做的事情是接受pip的建议并更新它。如果您不能这样做,错误消息应该是无害的-pip执行的检查通常不会阻止它工作

您可以使用禁用版本检查

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

我正在使用pkg_资源模块获取以下信息:

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)

希望这能有所帮助。

有趣的是,将shell=true arg添加到popen对象中是可行的。奇怪的是,它通常只需要与shell内置INS一起使用,那么该消息不是会转到stderr吗?出于某种原因,您正在将stderr重定向到stdout。忽略stderr(但检查返回值),您可能会删除多余的行。我需要保留当前的pip版本号以用于内部软件包目的。我认为您的环境可能受到限制。此解决方案仅为我显示以下软件包,软件包:wheel 0.29.0软件包:setuptools 28.8.0软件包:pip 9.0.1怪异…您使用的是什么版本的python以及如何安装软件包?2.7.14,我使用pip安装了所有软件包。不用担心,我已经找到了解决办法。shell=True arg似乎可以支持