Differenza tra subprocess.Popen e os.system


Risposte:


99

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().


Puoi anche usare al sts = p.wait()posto dell'ultima riga.
Sven Marnach,

1
@JacobMarble quindi supponiamo che io stia chiamando uno script di scraping del selenio da un altro script Python, quale di questi mi consentirebbe di completare lo script di scraping e quindi e solo allora di eseguire la riga di codice successiva? Come in, il mio raschiamento dovrebbe essere completato prima che l'esecuzione possa continuare.
Prakhar Mohan Srivastava

Forse menziona anche stackoverflow.com/questions/3172470/… per sottolineare che dovresti evitare di shell=Truefarlo se puoi. Avere questa opzione è uno dei vantaggi di subprocess.Popen()e delle sue funzioni di supporto.
tripleee

@PrakharMohanSrivastava Se si vuole bloccare il flusso e attendere che il comando per completare il suo lavoro fuori controllo: stackoverflow.com/a/2837319/5252192
Amirhossein

@PrakharMohanSrivastava, in generale, sia os.systeme subprocess.call/popen/runfa blocco / attesa per il comando alla fine: stackoverflow.com/a/14059648/4752883
alpha_989

47

subprocess.Popen()è un superinsieme rigoroso di os.system().


10
Questa è la risposta elegante completa.
Farsheed

23

os.systemè equivalente al systemcomando Unix , mentre subprocessera un modulo di supporto creato per fornire molte delle funzionalità fornite dai Popencomandi 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 commande 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 subprocesssicuramente perché hai tutte le strutture per l'esecuzione, oltre a un controllo aggiuntivo sul processo.


ok .. allora c'è un modo per eseguire sia os.system che popen in Windows env? Sono un principiante e ho bisogno di scavare più a fondo ..
Arovit

Sì, puoi usare sia os.system che sottoprocesso nell'ambiente Windows. Dai un'occhiata ai tutorial di base da effbot.org (libro online della libreria standard Python)
Senthil Kumaran

Attenzione: se si esegue su sistemi meno recenti, il modulo sottoprocesso non è disponibile.
Steve Hanov

21

Subprocess è basato su popen2 e come tale ha una serie di vantaggi: qui c'è un elenco completo nel PEP , ma alcuni sono:

  • usando il tubo nella shell
  • migliore supporto per la nuova riga
  • migliore gestione delle eccezioni

2

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.