Esiste una variante di subprocess.call
che può eseguire il comando senza la stampa dello standard o un modo per bloccare i messaggi standard?Esiste una versione silenziosa di subprocess.call?
risposta
Sì. Reindirizzare il suo stdout
a /dev/null
.
process = subprocess.call(["my", "command"], stdout=open(os.devnull, 'wb'))
'Popen' non è una variante di' call'. È una funzione completamente diversa. – jwg
Hai ragione. Tuttavia, Popen e Call hanno argomenti molto simili, quindi queste soluzioni funzionano per entrambi. Ho inviato una modifica. – jhrf
Si noti che da Python ver. 3.3 esiste in realtà un sottoprocesso.DEVNULL, che può essere usato al posto di 'open (os.devnull, 'wb')'. – EquipDev
Spesso questo tipo di chatter è su stderr, quindi si consiglia di disattivare anche quello. Ecco il mio esempio:
from subprocess import call, DEVNULL
return_code = call(args, stderr=DEVNULL, stdout=DEVNULL)
Nota:subprocess.DEVNULL
è disponibile dal Python 3.3. Se siete ancora su Python 2:
import os
with open(os.devnull, 'w') as shutup:
return_code = call(args, stdout=shutup, stderr=shutup)
notando che non si sta prendendo una decisione sull'uso di 'startupinfo' come mostrato qui: http://code.activestate.com/recipes/409002-launching-a-subprocess-without-a-console-window/ per evitare che la finestra lampeggi durante l'esecuzione python fuori da una console –
python 3 ora ha 'sottoprocesso.DEVNULL' (ma la tua risposta è di 7 anni) –
@ Jean-FrançoisFabre Questo è stato già menzionato su un commento sulla risposta accettata. Comunque, l'ho modificato adesso, grazie per il suggerimento. – wim
subprocess.call
accettano anche redirezioni stdin/output/error:
process = subprocess.call(["my", "command"], stdout=open(os.devnull, 'wb'))
[I documenti] (http://docs.python.org/2/library/subprocess.html#subprocess.call) specifica "Non utilizzare stdout = PIPE o stderr = PIPE con questa funzione". – mpen
open() non restituisce un PIPE, il PIPE significa "sottoprocesso.PIPE" che può essere letto dall'altra parte nel programma. Un open di 'os.devnull' non causerà problemi perché non c'è un fondo in questo file di buchi neri, il buffer non verrà mai riempito. – BOYPT
Ah. Ciò ha senso. Grazie! Non volevo usare 'Popen' perché restituisce un processo invece di un codice di stato. – mpen
Questa è una ricetta che uso molto: chiamare subprocess
e raccogliere l'uscita, e quando il comando fa scartare l'output, ma quando fallisce, stampa l'output.
import subprocess as sp
import sys
if "print" in __builtins__.__dict__:
prn = __builtins__.__dict__["print"]
else:
def prn(*args, **kwargs):
"""
prn(value, ..., sep=' ', end='\\n', file=sys.stdout)
Works just like the print function in Python 3.x but can be used in 2.x.
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
"""
sep = kwargs.get("sep", ' ')
end = kwargs.get("end", '\n')
file = kwargs.get("file", sys.stdout)
s = sep.join(str(x) for x in args) + end
file.write(s)
def rc_run_cmd_basic(lst_cmd, verbose=False, silent=False):
if silent and verbose:
raise ValueError("cannot specify both verbose and silent as true")
p = sp.Popen(lst_cmd, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)
tup_output = p.communicate()
s_cmd = ' '.join(lst_cmd)
if verbose:
prn()
prn("command: '%s'\n" % s_cmd)
if 0 != p.returncode:
prn()
prn("Command failed with code %d:" % p.returncode)
else:
prn("Command succeeded! code %d" % p.returncode)
if verbose:
prn("Output for: " + s_cmd)
prn(tup_output[0])
prn()
if not silent and 0 != p.returncode:
prn("Error output for: " + s_cmd)
prn(tup_output[1])
prn()
return p.returncode
Io uso subprocess.check_output in questi casi e rilasciare il valore restituito. Potresti voler aggiungere un commento al tuo codice che indichi perché stai usando check_output al posto di check_call. check_output è anche più carino quando si verifica un errore e sei interessato all'output dell'errore. Esempio di codice qui sotto. L'output viene visualizzato solo quando si disapprova la linea di stampa. Se il comando fallisce, viene generata un'eccezione.
import subprocess
ret = subprocess.check_output(["cat", "/tmp/1"])
#print ret
In che modo il rilascio del valore di ritorno impedisce l'uscita allo stdout? – Emre
subprocess.check_output dovrebbe acquisire l'output e restituirlo. Stai vedendo un comportamento diverso? –
Catturare e ignorare le opere, ma spreca memoria sul valore catturato che non viene mai utilizzato. Scartare l'output correttamente è più robusto. – tripleee
- 1. Esiste una versione di log4net per Silverlight?
- 2. Esiste una versione standard, striata di memcpy?
- 3. Esiste una versione Cygwin di GNU make?
- 4. Esiste una versione di $ getJSON che non utilizza una richiamata?
- 5. Python: subprocess.call pipe interrotte
- 6. Problema con subprocess.call
- 7. subprocess.call env var
- 8. Python subprocess.call blocking
- 9. Esiste una versione di MySQL del% TIPO di Oracle
- 10. Notifica locale silenziosa IOS
- 11. chiamare rsync da python subprocess.call
- 12. Python: subprocess.Popen e subprocess.call hang
- 13. vim autocmd esecuzione silenziosa
- 14. Esiste una versione di ELMAH per .NET 4?
- 15. Esiste una versione supportata da Java 8 di SqlJ?
- 16. Esiste una versione XCode di "Override/Implement Method"?
- 17. Esiste una versione asincrona di DirectoryInfo.GetFiles/Directory.GetDirectories in dotNet?
- 18. Esiste una versione di kdevelop che posso installare su Windows?
- 19. Esiste una versione mobi di Java Language Specification?
- 20. Esiste una versione aggiornata delle Convenzioni di codice Java
- 21. Esiste una versione Selenium 2 di Selenium IDE?
- 22. Esiste una versione dell'obiettivo-c/iPhone di currentTimeMillis() da Java?
- 23. php cURL opzione silenziosa?
- 24. Installazione modalità silenziosa MSIEXEC
- 25. Gestione di directory con spazi Python subprocess.call()
- 26. Stampa silenziosa di PDF da Java
- 27. esecuzione modalità silenziosa con java.exe
- 28. Esiste una versione py2exe compatibile con python 3.5?
- 29. Installazione silenziosa di un pacchetto MSI
- 30. Esiste una versione "asincrona" dell'operatore filtro in RxJs?
strettamente legato http://stackoverflow.com/questions/5495078/how-do-you-discard-subprocess-output-in-python, in particolare a causa delle chiamate utilizza Popen. –
correlati: [Come nascondere l'output del sottoprocesso in Python 2.7] (http://stackoverflow.com/q/11269575/4279) – jfs