2015-01-13 10 views
19

questi sono i miei codici di pitone:pitone sottoprocesso check_output restituito stato diverso da zero l'uscita 1

import subprocess 
subprocess.check_output("ls",shell=True,stderr=subprocess.STDOUT) 

import subprocess 
subprocess.check_output("yum",shell=True,stderr=subprocess.STDOUT) 

la prima opera bene, ma il secondo ritorno:

Traceback (most recent call last): 
File "/usr/lib/x86_64-linux-gnu/gedit/plugins/pythonconsole/console.py", line 378, in __run 
r = eval(command, self.namespace, self.namespace) 
File "<string>", line 1, in <module> 
File "/usr/lib/python3.4/subprocess.py", line 616, in check_output 
raise CalledProcessError(retcode, process.args, output=output) 
subprocess.CalledProcessError: Command 'yum' returned non-zero exit status 1 

perché questo accade? è perché ls è il comando di shell originale ma yum è il nuovo pacchetto? come risolvere questo problema?

risposta

14

Il comando yum da avviare è stato eseguito correttamente. Restituisce uno stato diverso da zero, il che significa che si è verificato un errore durante l'elaborazione del comando. Probabilmente vorrai aggiungere qualche argomento al tuo comando yum per correggerlo.

Il codice potrebbe mostrare questo errore in questo modo:

import subprocess 
try: 
    subprocess.check_output("dir /f",shell=True,stderr=subprocess.STDOUT) 
except subprocess.CalledProcessError as e: 
    raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output)) 
+0

quindi se voglio solo implementare il comando (g3-from-scratch.csh tpall.fna da zero) in python. Questo comando creerà alcuni file nella directory corrente ma non darà risposta in console, io collaudo questo comando in shell, funziona. come potrei implementarlo in python? originariamente, io uso os.system(), ma restituisce solo (sh: 1: g3-from-scratch.csh: non trovato) –

+0

Hai letto questo: https: // docs. python.org/3.4/library/subprocess.html – Plouff

+0

Ho provato il tuo codice per yum, funziona bene, ma non per g3-from-scratch.csh. Non sono ciò che è diverso con loro, posso usarli direttamente in console. –

6

La parola check_ nel nome significa che se il comando (la shell in questo caso che restituisce lo stato di uscita dell'ultimo comando (yum in questo caso)) restituisce lo stato diverso da zero quindi solleva l'eccezione CalledProcessError. È di progettazione. Se il comando che si desidera eseguire può restituire uno stato diverso da zero in caso di successo, prendere o l'eccezione o non utilizzare i metodi check_. Si potrebbe utilizzare subprocess.call nel tuo caso, perché si sta ignorando l'output catturato, ad es .:

import subprocess 

rc = subprocess.call(['grep', 'pattern', 'file'], 
        stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) 
if rc == 0: # found 
    ... 
elif rc == 1: # not found 
    ... 
elif rc > 1: # error 
    ... 

Non è necessario shell=True per eseguire i comandi dalla tua domanda.

+0

Quindi si controlla il codice di ritorno dopo 'subprocess.call'. C'è un caso reale in cui dovresti usare 'call' invece di' check_output' a parte lo scenario di comando che ha un codice di ritorno non valido? Grazie! – Plouff

+0

Le eccezioni dovrebbero essere sollevate solo in casi eccezionali (ci sono eccezioni ma la regola generale vale). Se ti aspetti che 'grep' restituisca' 1' (se non è un errore nella tua applicazione) non dovresti sollevare l'eccezione. Lo stato di uscita viene controllato per scoprire se il modello è stato trovato nel file: è l'intero punto di esecuzione del processo figlio in primo luogo. Inoltre, non dovresti usare 'check_output()' a meno che tu non usi il suo valore di ritorno (l'output dal sottoprocesso) – jfs

+0

Grazie per le tue spiegazioni. Capisco l'idea con 'grep', ma non è ancora così ovvio per me. Ho appena creato una domanda: http://stackoverflow.com/q/27938050/882697. Potresti dare un'occhiata? Grazie ancora! – Plouff

Problemi correlati