Puoi anche chiamarli tramite il subprocess
modulo, ma ...
Per Python 2.7 e versioni successive, utilizzare semplicemente
subprocess.check_call(['open', filename])
In Python 3.5+ puoi usare equivalentemente il leggermente più complesso ma anche un po 'più versatile
subprocess.run(['open', filename], check=True)
Se devi essere compatibile con Python 2.4, puoi utilizzare subprocess.call()
e implementare il tuo controllo degli errori:
try:
retcode = subprocess.call("open " + filename, shell=True)
if retcode < 0:
print >>sys.stderr, "Child was terminated by signal", -retcode
else:
print >>sys.stderr, "Child returned", retcode
except OSError, e:
print >>sys.stderr, "Execution failed:", e
Ora, quali sono i vantaggi dell'utilizzo subprocess
?
- Sicurezza: in teoria, questo è più sicuro, ma in realtà abbiamo bisogno di eseguire una riga di comando in un modo o nell'altro; in entrambi gli ambienti, abbiamo bisogno dell'ambiente e dei servizi per interpretare, ottenere percorsi e così via. In nessuno dei due casi stiamo eseguendo un testo arbitrario, quindi non ha un
'filename ; rm -rf /'
problema intrinseco "ma puoi digitare " e, se il nome del file può essere corrotto, l'uso subprocess.call
ci offre una protezione aggiuntiva.
- Gestione degli errori: in realtà non ci dà più il rilevamento degli errori, dipendiamo comunque
retcode
in entrambi i casi; ma il comportamento di sollevare esplicitamente un'eccezione in caso di errore ti aiuterà sicuramente a notare se si verifica un errore (sebbene in alcuni scenari, un traceback potrebbe non essere affatto più utile che semplicemente ignorare l'errore).
- Genera un sottoprocesso (non bloccante) : non abbiamo bisogno di attendere il processo figlio, dato che stiamo per affermazione del problema che avvia un processo separato.
All'obiezione "Ma subprocess
è preferito". Tuttavia, os.system()
non è deprecato ed è in qualche modo lo strumento più semplice per questo particolare lavoro. Conclusione: l'utilizzo os.system()
è quindi anche una risposta corretta.
Uno svantaggio evidente è che il start
comando Windows richiede di passare, il shell=True
che annulla la maggior parte dei vantaggi dell'utilizzo subprocess
.