ЕСЛИ он активно используется в коде, который вы хотите запустить, но этот код не нужно поддерживать в течение длительного времени (или вам нужно быстрое исправление, независимо от потенциальных проблем с обслуживанием в будущем), тогда вы можете уйти от удара (он же патч обезьяны) это везде, где импортируется подпроцесс ...
Просто снимите код с 2.7 и вставьте его таким образом ...
import subprocess
if "check_output" not in dir( subprocess ):
def f(*popenargs, **kwargs):
if 'stdout' in kwargs:
raise ValueError('stdout argument not allowed, it will be overridden.')
process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs)
output, unused_err = process.communicate()
retcode = process.poll()
if retcode:
cmd = kwargs.get("args")
if cmd is None:
cmd = popenargs[0]
raise subprocess.CalledProcessError(retcode, cmd)
return output
subprocess.check_output = f
Может потребоваться легкое ерзание.
Имейте в виду, что поддержание таких грязных маленьких бэкпортов лежит на вас. Если ошибки обнаружены и исправлены в последней версии Python, вы: а) должны это заметить и б) обновить свою версию, если хотите оставаться в безопасности. Кроме того, переопределение и определение внутренних функций самостоятельно - худший кошмар следующего парня, особенно когда следующий парень - это ВЫ, через несколько лет, и вы совсем забыли о классных хитростях, которые вы делали в прошлый раз! В итоге: это очень редко бывает хорошей идеей.
CalledProcessErrorкогда процесс возвращает ненулевой код возврата.