2011-10-06 12 views
126

Voglio chiamare un programma esterno da Python. Ho usato sia Popen() e call() per farlo.Qual è la differenza tra sottoprocesso Popen e chiamata (come posso usarli)?

Qual è la differenza tra i due?

Il mio obiettivo specifico è eseguire il seguente comando da Python. Non sono sicuro di come funzionano i reindirizzamenti.

./my_script.sh > output 

ho letto the documentation e si dice che call() è una funzione di convenienza o di una funzione di scelta rapida. Perdiamo energia utilizzando call() anziché Popen()?

+0

Quale parte della documentazione ti ha confuso? La definizione di 'call()' sembra essere molto chiara. Potete fornire un preventivo o un link in modo da sapere su cosa concentrarsi in una risposta? –

risposta

188

Esistono due modi per eseguire il reindirizzamento. Entrambi si applicano a subprocess.Popen o subprocess.call.

  1. impostare la parola chiave argomento shell = True o executable = /path/to/the/shell e specificare il comando esattamente come lo avete lì.

  2. Dal momento che si sta solo reindirizzare l'output in un file, impostare la parola chiave argomento

    stdout = an_open_writeable_file_object 
    

    dove i punti oggetto al file output.

subprocess.Popen è più ampio di subprocess.call.

Popen non si blocca, consentendo di interagire con il processo mentre è in esecuzione, o continuare con altre cose nel programma Python. La chiamata a Popen restituisce un oggetto Popen.

callfa blocco. Sebbene supporti tutti gli stessi argomenti del costruttore Popen, così puoi ancora impostare l'output del processo, le variabili ambientali, ecc., Lo script attende il completamento del programma e call restituisce un codice che rappresenta lo stato di uscita del processo.

returncode = call(*args, **kwargs) 

è fondamentalmente lo stesso che chiedono

returncode = Popen(*args, **kwargs).wait() 

call è solo una funzione di convenienza. E 'implementazione in CPython è in subprocess.py:

def call(*popenargs, timeout=None, **kwargs): 
    """Run command with arguments. Wait for command to complete or 
    timeout, then return the returncode attribute. 

    The arguments are the same as for the Popen constructor. Example: 

    retcode = call(["ls", "-l"]) 
    """ 
    with Popen(*popenargs, **kwargs) as p: 
     try: 
      return p.wait(timeout=timeout) 
     except: 
      p.kill() 
      p.wait() 
      raise 

Come si può vedere, si tratta di un involucro sottile intorno Popen.

+7

Fondamentalmente Popen e Call sono asincroni e le funzioni Synchronous utilizzano rispettivamente i comandi di Linux. – user3016020

+1

Qual è il vantaggio dell'uso di popen? Non sarebbe sicuro aspettare fino a quando il programma chiamato finisce prima? – Tom

+3

@Tom Spesso no. Cosa succede se si desidera leggere qualche output, quindi inviare più input al programma, leggere più output risultanti da tale input, ripetere? – agf

Problemi correlati