examples example español python subprocess

python - example - OSError:[Errno 8] Error de formato de ejecución



subprocess python 3 example (5)

¿Has probado esto?

Out = subprocess.Popen(''/usr/local/bin/script hostname = actual_server_name -p LONGLIST''.split(), shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

Editado por el comentario apt de @JFSebastian

Estoy teniendo dificultades para analizar los argumentos para subprocess.Popen. Estoy tratando de ejecutar un script en mi servidor Unix. La sintaxis del script cuando se ejecuta en el indicador de comandos de shell es la siguiente: /usr/local/bin/script hostname = <hostname> -p LONGLIST . No importa cómo lo intente, el script no se está ejecutando dentro de subprocess.Popen

El espacio antes y después de "=" es obligatorio.

import subprocess Out = subprocess.Popen([''/usr/local/bin/script'', ''hostname = '', ''actual server name'', ''-p'', ''LONGLIST''],shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

Lo anterior no funciona.

Y cuando uso shell = False, obtengo OSError: [Errno 8] Exec format error


No sería incorrecto mencionar que Pexpect lanza un error similar

#python -c "import pexpect; p=pexpect.spawn(''/usr/local/ssl/bin/openssl_1.1.0f version''); p.interact()" Traceback (most recent call last): File "<string>", line 1, in <module> File "/usr/lib/python2.7/site-packages/pexpect.py", line 430, in __init__ self._spawn (command, args) File "/usr/lib/python2.7/site-packages/pexpect.py", line 560, in _spawn os.execv(self.command, self.args) OSError: [Errno 8] Exec format error

Aquí, el archivo openssl_1.1.0f en la ruta especificada tiene un comando exec especificado y ejecuta el binario de openssl real cuando se llama.

Por lo general, no mencionaría esto a menos que tenga la causa principal, pero este problema no estaba allí antes. No se puede encontrar el problema similar, la explicación más cercana para que funcione es la misma que se proporciona en @jfs arriba.

lo que funcionó para mí es a la vez

  • agregando /bin/bash al comienzo del comando o archivo que está
    enfrentar el problema con, o
  • añadiendo shebang #!/bin/sh como la primera línea.

por ej.

#python -c "import pexpect; p=pexpect.spawn(''/bin/bash /usr/local/ssl/bin/openssl_1.1.0f version''); p.interact()" OpenSSL 1.1.0f 25 May 2017


Secuestraré este hilo para señalar que este error también puede ocurrir cuando el objetivo de Popen no es ejecutable. Aprendí de una manera difícil cuando, por accidente, tuve que anular un archivo binario perfectamente ejecutable con un archivo zip.


Si cree que el espacio antes y después de "=" es obligatorio, inténtelo como un elemento separado en la lista.

Out = subprocess.Popen([''/usr/local/bin/script'', ''hostname'', ''='', ''actual server name'', ''-p'', ''LONGLIST''],shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)


OSError: [Errno 8] Exec format error puede producir un OSError: [Errno 8] Exec format error si no hay una línea shebang en la parte superior del script de shell y está intentando ejecutar el script directamente. Aquí hay un ejemplo que reproduce el problema:

>>> with open(''a'',''w'') as f: f.write(''exit 0'') # create the script ... >>> import os >>> os.chmod(''a'', 0b111101101) # rwxr-xr-x make it executable >>> os.execl(''./a'', ''./a'') # execute it Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/os.py", line 312, in execl execv(file, args) OSError: [Errno 8] Exec format error

Para solucionarlo, simplemente agregue el shebang, por ejemplo, si es un script de shell; ante #!/bin/sh en la parte superior de su script:

>>> with open(''a'',''w'') as f: f.write(''#!/bin/sh/nexit 0'') ... >>> os.execl(''./a'', ''./a'')

Ejecuta la exit 0 sin errores.

En los sistemas POSIX, el shell analiza la línea de comando, es decir, su secuencia de comandos no verá espacios alrededor = por ejemplo, si la script es:

#!/usr/bin/env python import sys print(sys.argv)

luego ejecutándolo en el shell:

$ /usr/local/bin/script hostname = ''<hostname>'' -p LONGLIST

produce:

[''/usr/local/bin/script'', ''hostname'', ''='', ''<hostname>'', ''-p'', ''LONGLIST'']

Nota: no hay espacios alrededor de ''='' . He agregado citas en torno a <hostname> para escapar de los metacaracteres de redirección <> .

Para emular el comando de shell en Python, ejecute:

from subprocess import check_call cmd = [''/usr/local/bin/script'', ''hostname'', ''='', ''<hostname>'', ''-p'', ''LONGLIST''] check_call(cmd)

Nota: no shell=True . Y no necesita escapar <> porque no se ejecuta ninguna shell.

"Exec format error" podría indicar que su script tiene un formato no válido, ejecute:

$ file /usr/local/bin/script

para averiguar qué es. Compara la arquitectura con la salida de:

$ uname -m