2011-01-29 15 views
30
import subprocess 
retcode = subprocess.call(["/home/myuser/go.sh", "abc.txt", "xyz.txt"]) 

Quando eseguo queste 2 righe, sarò facendo esattamente questo ?:È questo il modo giusto per eseguire uno script di shell in Python?

/home/myuser/go.sh abc.txt xyz.txt 

Perché ricevo questo errore? Ma quando eseguo go.sh normalmente, non ottengo quell'errore.

File "/usr/lib/python2.6/subprocess.py", line 480, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "/usr/lib/python2.6/subprocess.py", line 633, in __init__ 
    errread, errwrite) 
    File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child 
    raise child_exception 
OSError: [Errno 8] Exec format error 
+7

Il vostro script di shell hanno la hashbang corretta? – William

+1

Hai mai risolto questo? – Johnsyweb

risposta

1

Sì, è perfettamente bene se tutto quello che stai facendo è chiamando lo script di shell, in attesa che sia completato, e la raccolta di suo stato di uscita, mentre lasciando il suo stdin, stdout e stderr essere ereditato da tua Python processi. Se hai bisogno di un maggiore controllo su uno di questi fattori, allora usi semplicemente il più generale subprocess.Popen, ma altrimenti quello che hai va bene.

+1

Puoi dirmi perché sto ricevendo questo errore: OSError: [Errno 8] Errore di formato Exec. Quando lo eseguo normalmente va bene. – TIMEX

0

Sì, questo è il modo preferito per eseguire qualcosa ..

Dal momento che si sta passando tutti gli argomenti attraverso una serie (che verrà usata gor un exec() - chiamata stile internamente) e non come una stringa argomento valutato da una shell è anche molto sicuro poiché l'iniezione di comandi della shell è impossibile.

+0

Puoi dirmi perché sto ricevendo questo errore: OSError: [Errno 8] Errore di formato Exec. Quando lo eseguo normalmente va bene. – TIMEX

+0

Lo script è eseguibile per l'utente che esegue lo script python? – ThiefMaster

33

OSError: [Errno 8] Exec format error

Si tratta di un errore segnalato dal sistema operativo quando si cerca di eseguire /home/myuser/go.sh.

Mi sembra che lo shebang (#!) linea go.sh non sia valido.

Ecco un esempio di script che viene eseguito dalla shell, ma non da Popen:

#\!/bin/sh 
echo "You've just called $0 [email protected]" 

Rimozione del \ dalla prima linea risolve il problema.

+1

Errore simile accaduto anche a me, la prima riga era un commento bash e poi lo shebang. Quindi python non stava sottomettendo lo script, ma quando ho messo lo shebang sulla prima riga ha funzionato. Puoi spiegare perché, per favore? – user1004985

+0

@ user1004985: La riga shebang *** deve essere la prima riga del file. Assolutamente. – Johnsyweb

11

Modificare il codice a seguire:

retcode = subprocess.call(["/home/myuser/go.sh", "abc.txt", "xyz.txt"], shell=True,) 

Avviso "shell = True"

Da: http://docs.python.org/library/subprocess.html#module-subprocess

On Unix, with shell=True: If args is a string, it specifies the command string to execute through the shell. This means that the string must be formatted exactly as it would be when typed at the shell prompt.

1

Ho appena ricevuto questo errore su Mac OS, durante il tentativo di chiamare uno script a riga singola che utilizza subprocess.call. Lo script ha funzionato bene quando chiamato dalla riga di comando. Dopo aver aggiunto la linea shebang #!/usr/bin/env sh, è stata eseguita correttamente anche tramite subprocess.call.

Appare, mentre la shell ha un esecutore predefinito per i file di testo contrassegnati come eseguibili, subprocess.Popen no.

2

ho recentemente imbattuto in questo problema con uno script che si presentava così:

% cat /tmp/test.sh 
           <-- Note the empty line 
#!/bin/sh 
mkdir /tmp/example 

Lo script ha funzionato benissimo dalla linea di comando, ma non è riuscito con

OSError: [Errno 8] Exec format error 

quando eseguito tramite

subprocess.Popen(['/tmp/test.sh']).communicate() 

(La soluzione, ovviamente, era rimuovere la linea vuota).

1
In :call?? 
Signature: call(*popenargs, **kwargs) 
Source: 
def call(*popenargs, **kwargs): 
    """Run command with arguments. Wait for command to complete, then 
    return the returncode attribute. 

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

    retcode = call(["ls", "-l"]) 
    """ 
    return Popen(*popenargs, **kwargs).wait() 
File:  /usr/lib64/python2.7/subprocess.py 
Type:  function 

chiamata semplicemente invocare Popen, utilizzare il metodo wait() Attendere i popenargs completa

Problemi correlati