Risposte:
Se controlli la sezione dei processi secondari dei documenti Python , noterai che c'è un esempio di come sostituire os.system()
con subprocess.Popen()
:
sts = os.system("mycmd" + " myarg")
... fa la stessa cosa di ...
sts = Popen("mycmd" + " myarg", shell=True).wait()
Il codice "migliorato" sembra più complicato, ma è meglio perché una volta che lo sai subprocess.Popen()
, non hai bisogno di nient'altro. subprocess.Popen()
sostituisce molti altri strumenti ( os.system()
è solo uno di quelli) che erano sparsi in altri tre moduli Python.
Se aiuta, pensa a subprocess.Popen()
come molto flessibile os.system()
.
shell=True
farlo se puoi. Avere questa opzione è uno dei vantaggi di subprocess.Popen()
e delle sue funzioni di supporto.
os.system
e subprocess.call/popen/run
fa blocco / attesa per il comando alla fine: stackoverflow.com/a/14059648/4752883
os.system
è equivalente al system
comando Unix , mentre subprocess
era un modulo di supporto creato per fornire molte delle funzionalità fornite dai Popen
comandi con un'interfaccia più semplice e controllabile. Quelli sono stati progettati in modo simile al comando Unix Popen .
system()
esegue un comando specificato in command chiamando/bin/sh -c command
e ritorna dopo che il comando è stato completato
Mentre:
La
popen()
funzione apre un processo creando una pipe, un fork e invocando la shell.
Se stai pensando quale usare, usa subprocess
sicuramente perché hai tutte le strutture per l'esecuzione, oltre a un controllo aggiuntivo sul processo.
Subprocess è basato su popen2 e come tale ha una serie di vantaggi: qui c'è un elenco completo nel PEP , ma alcuni sono:
Quando si esegue python (cpython) su Windows, <built-in function system>
os.system verrà eseguito sotto le tende _wsystem mentre se si utilizza un sistema operativo non Windows, verrà utilizzato system .
Al contrario, Popen dovrebbe usare CreateProcess su Windows e _posixsubprocess.fork_exec nei sistemi operativi basati su posix.
Detto questo, un importante consiglio viene dalla documentazione di os.system , che dice:
Il modulo sottoprocesso fornisce servizi più potenti per generare nuovi processi e recuperare i loro risultati; l'utilizzo di quel modulo è preferibile rispetto all'utilizzo di questa funzione. Vedere la sezione Sostituzione di vecchie funzioni con il modulo del sottoprocesso nella documentazione del sottoprocesso per alcune utili ricette.
sts = p.wait()
posto dell'ultima riga.