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