26 votos

Es esta la forma correcta de ejecutar un script de shell en el interior de Python?

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

Cuando me encuentro con estas 2 líneas, voy a estar haciendo exactamente esto?:

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

¿Por qué me sale este error? Pero cuando voy a ejecutar go.sh normalmente, no tengo ese error.

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

30voto

Johnsyweb Puntos 45395

OSError: [Errno 8] Exec format error

Este es un error reportado por el sistema operativo cuando se intenta ejecutar /home/myuser/go.sh.

A mí me parece que el shebang (#!) de la línea de go.sh no es válido.

Aquí se muestra un ejemplo de secuencia de comandos que se ejecuta desde la consola, pero no de Popen:

#\!/bin/sh
echo "You've just called $0 $@."

La eliminación de la \ desde la primera línea se soluciona el problema.

8voto

jbp Puntos 381

Cambiar el código siguiente:

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

Aviso de "shell=True"

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

En Unix, shell=True: Si args es un cadena que especifica el comando cadena para ejecutar a través de la cáscara. Esto significa que la cadena debe ser formato exactamente como sería cuando escribió en el prompt de la shell.

2voto

unutbu Puntos 222216

Hace poco me encontré con este problema con un script que se veía así:

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

El guión corrió fino desde la línea de comandos, pero no pudo con

OSError: [Errno 8] Exec format error

cuando se ejecuta a través de

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

(La solución, por supuesto, era para quitar el vacío de la línea).

1voto

Adam Rosenfield Puntos 176408

Sí, que está perfectamente bien si todo lo que estamos haciendo es llamar a la secuencia de comandos de shell, a la espera de que se complete, y la recolección de estado de su salida, mientras que su stdin, stdout, y stderr ser heredado de su Python proceso. Si necesita más control sobre alguno de esos factores, entonces usted sólo tiene que utilizar el más general subprocess.Popen, pero de lo contrario lo que tiene está muy bien.

1voto

George Puntos 945

Acabo de recibir este error en Mac OS, mientras que tratando de llamar a una línea de comandos usando subprocess.call. El guión corrió bien cuando se llama desde la línea de comandos. Después de agregar el shebang línea #!/usr/bin/env sh, también corrió la multa a través de subprocess.call.

Parece que, mientras que la consola tiene un defecto ejecutor de archivos de texto marcado como ejecutable, subprocess.Popen no.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X