SE è usato pesantemente nel codice che si desidera eseguire, ma che il codice non deve essere mantenuta a lungo termine (o avete bisogno di un soluzione rapida indipendentemente potenziali problemi di manutenzione in futuro), allora si potrebbe anatra punzone (aka patch di scimmia) in ovunque sottoprocesso è importata ...
Basta sollevare il codice da 2.7 e inserirla questa convenzione ...
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
Potrebbe essere necessario un minore disturbo.
Tieni a mente, anche se l'onere è su di te per mantenere sporchi piccoli backport come questo. Se i bug vengono scoperti e corretti nell'ultimo python, allora a) devi notarlo e b) aggiornare la tua versione se vuoi rimanere al sicuro. Inoltre, ignorare lo & definendo le funzioni interne da solo è il peggior incubo del ragazzo successivo, specialmente quando il prossimo ragazzo è TU diversi anni dopo la linea e hai dimenticato tutti gli hack che hai fatto l'ultima volta! In breve: raramente è una buona idea.
differenza check_output, questo non genera 'CalledProcessError' quando il processo restituisce un codice di ritorno diverso da zero. –
@SridharRatnakumar: ovviamente perché c'è una grande differenza tra loro, vale a dire: blocco e non blocco. Sono per diversi casi d'uso! – lpapp
L'ho inserito in un 'lambda' in questo modo:' check_output = lambda args: Popen (args, stdout = PIPE) .communicate() [0] '. Solo perché sono in un interprete interattivo ed è una specie di PITA a scrivere le funzioni di definizione multilinea in quelle. Ho usato 'dal sottoprocesso di importazione Popen, PIPE' all'inizio della sessione. – ArtOfWarfare