2012-07-19 13 views
13

eseguo un comando in python utilizzando la funzione subprocess.Popen() come il seguente:pitone: alzare child_exception, OSError: [Errno 2] Nessun file o directory

omp_cmd = 'cat %s | omp -h %s -u %s -w %s -p %s -X -' %(temp_xml, self.host_IP, self.username, self.password, self.port) 
xmlResult = Popen(omp_cmd, stdout=PIPE, stderr=STDOUT) 

Nella shell funziona bene anche senza errore, ma in python ottengo:

File "/home/project/vrm/apps/audit/models.py", line 148, in sendOMP 
    xmlResult = Popen(omp_cmd, stdout=PIPE, stderr=STDOUT) 
    File "/usr/local/lib/python2.7/subprocess.py", line 679, in __init__ 
    errread, errwrite) 
    File "/usr/local/lib/python2.7/subprocess.py", line 1228, in _execute_child 
    raise child_exception 
    OSError: [Errno 2] No such file or directory 

Ho cercato l'errore ma nessuno di loro ha risolto il mio problema. Qualcuno sa qual è la causa di questo problema? Grazie.

risposta

18

Se si passa il comando come stringa a Popen e se i comandi contengono pipe per altri comandi, è necessario utilizzare la parola chiave shell=True.

Non ho molta familiarità con il comando omp, ma questo ha un odore terribile come un uso inutile di cat. Vorrei pensare che un modo migliore per raggiungere questo obiettivo sarebbe quello di:

import shlex 
omp_cmd = 'omp -h %s -u %s -w %s -p %s -X %s' %(self.host_IP, self.username, self.password, self.port, temp_xml) 
xmlResult = Popen(shlex.split(omp_cmd), stdout=PIPE, stderr=STDOUT) 

Oppure, se non è un uso inutile di cat (Hai davvero bisogno di pipe il file in via stdin), è possibile farlo con sottoprocesso troppo:

import shlex 
omp_cmd = 'omp -h %s -u %s -w %s -p %s -X -' %(self.host_IP, self.username, self.password) 
with open(temp_xml) as stdin: 
    xmlResult = Popen(shlex.split(omp_cmd), stdin=stdin, stdout=PIPE, stderr=STDOUT) 
+0

Hai ragione !! Ancora una domanda, se shell = False, gli argomenti dovrebbero essere una lista, giusto? Qual è la differenza tra questi due modi? –

+1

Per rispondere alla tua domanda, quel comando che ho memorizzato nel file è lungo 9000 righe, il mio sistema operativo mi darà "arg elenco errore troppo lungo" :) –

+2

@da_zhuang - sì, con 'shell = False', gli argomenti sono tipicamente una lista. Ho usato la funzione 'shlex.split' che prende una stringa e la divide in una lista allo stesso modo di una shell tipica. con 'shell = True', si passa una stringa e tale stringa viene valutata da una shell. con 'shell = False' si passa una stringa o una lista. Se una stringa, viene valutata come se fosse l'unico comando. ('" ls -l "' fallirebbe dato che non esiste alcun comando 'ls -l', solo' ls'). Se si tratta di un elenco, ogni elemento viene considerato come argomento. '[" ls "," -l "]' – mgilson

0

Questo errore ha anche verificato anche per me con gli script tossicologici, scopre che un virtualenv è creato con tox, che ha un percorso asolute con lunghezza circa 96 personaggi, ma ogni volta che prende la tua bin assoluto'/ percorso pip per circa 123 caratteri, c'è un errore di chiamata, OSError2.

'ERRORE: invocazione non riuscita (errno 2), OSError: [Errno 2] Nessun file o directory'

Python: Python 2.7.6 virtualenv: 15.1.0 tox: 2.9.1 pip: 9.0.1 ubuntu 14.04 test è stato eseguito con copertura: Django (1.8-1.11) test con py27, py35 ogni

Risoluzione: ho creato il mio virtualenv (con il percorso abs < = (96-100) caratteri) prima dove è installato tox, clonato il mio progetto da utilizzare con questa installazione tox e vi rtualenv, tox lo crea proprio ora virtualenvs e funziona bene.

spero che sia d'aiuto.

Problemi correlati