IF jest używany intensywnie w kodzie, który chcesz uruchomić, ale że kod nie musi być utrzymywana długoterminowy (lub potrzebują szybkie ustalenie niezależnie od potencjalnych bóle głowy konserwacji w przyszłości), a następnie można kaczka stempel (aka małpa Patch) to w gdziekolwiek podproces jest importowany ...
Wystarczy podnieść kod z 2,7 i włóż go thusly ...
import subprocess
if "check_output" not in dir(subprocess): # duck punch it in!
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 drobne wiercenie.
Pamiętaj jednak, że ponosisz odpowiedzialność za utrzymywanie brudnych, niewielkich backportów w ten sposób. Jeśli błędy zostaną wykryte i poprawione w najnowszym pythonie, musisz a) to zauważyć i b) zaktualizować wersję, jeśli chcesz zachować bezpieczeństwo. Nadpisywanie & samemu określając wewnętrzne funkcje jest najgorszym koszmarem następnego faceta, szczególnie, gdy następny facet jest TY kilka lat w dół i zapomniałeś o grach hakerskich, które zrobiłeś ostatnio! Podsumowując: bardzo rzadko jest to dobry pomysł.
przeciwieństwie check_output, to nie wywołuje 'CalledProcessError', gdy proces zwraca niezerowy kod powrotu. –
@SridharRatnakumar: oczywiście, ponieważ istnieje między nimi duża różnica, a mianowicie: blokowanie i nie blokowanie. Są one przeznaczone do różnych zastosowań! – lpapp
Wepchnąłem to w 'lambda' w ten sposób:' check_output = Argumenty lambda: Popen (args, stdout = PIPE) .communicate() [0] '. Tylko dlatego, że jestem w interakcyjnym tłumaczu i to jest rodzaj PITA do wypisywania w tych funkcjach funkcji multilinii. Użyłem 'z podprocesowego importu Popen, PIPE' wcześniej w sesji. – ArtOfWarfare