JEŚLI jest intensywnie używany w kodzie, który chcesz uruchomić, ale ten kod nie musi być utrzymywany przez długi czas (lub potrzebujesz szybkiej naprawy niezależnie od potencjalnych problemów związanych z konserwacją w przyszłości), możesz uchylić się przed uderzeniem (inaczej łatka małpa) wszędzie tam, gdzie importowany jest podproces ...
Po prostu podnieś kod z 2.7 i wstaw go w ten sposób ...
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
Może być wymagane lekkie wiercenie się.
Pamiętaj, że to na tobie spoczywa obowiązek utrzymania takich brudnych, małych backportów. Jeśli błędy zostaną wykryte i poprawione w najnowszym Pythonie, to a) musisz to zauważyć i b) zaktualizować swoją wersję, jeśli chcesz zachować bezpieczeństwo. Ponadto, samodzielne nadpisywanie i definiowanie funkcji wewnętrznych jest najgorszym koszmarem następnego faceta, zwłaszcza gdy następny facet jest TY kilka lat później i zapomniałeś o wstrętnych hackach, które zrobiłeś ostatnim razem! Podsumowując: bardzo rzadko jest to dobry pomysł.
CalledProcessErrorgdy proces zwraca niezerowy kod powrotu.