python – OSError: [Errno 8] Exec format error
python – OSError: [Errno 8] Exec format error
OSError: [Errno 8] Exec format error
can happen if there is no shebang line at the top of the shell script and you are trying to execute the script directly. Heres an example that reproduces the issue:
>>> 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
To fix it, just add the shebang e.g., if it is a shell script; prepend #!/bin/sh
at the top of your script:
>>> with open(a,w) as f: f.write(#!/bin/shnexit 0)
...
>>> os.execl(./a, ./a)
It executes exit 0
without any errors.
On POSIX systems, shell parses the command line i.e., your script wont see spaces around =
e.g., if script
is:
#!/usr/bin/env python
import sys
print(sys.argv)
then running it in the shell:
$ /usr/local/bin/script hostname = <hostname> -p LONGLIST
produces:
[/usr/local/bin/script, hostname, =, <hostname>, -p, LONGLIST]
Note: no spaces around =
. Ive added quotes around <hostname>
to escape the redirection metacharacters <>
.
To emulate the shell command in Python, run:
from subprocess import check_call
cmd = [/usr/local/bin/script, hostname, =, <hostname>, -p, LONGLIST]
check_call(cmd)
Note: no shell=True
. And you dont need to escape <>
because no shell is run.
Exec format error
might indicate that your script
has invalid format, run:
$ file /usr/local/bin/script
to find out what it is. Compare the architecture with the output of:
$ uname -m
I will hijack this thread to point out that this error may also happen when target of Popen is not executable. Learnt it hard way when by accident I have had override a perfectly executable binary file with zip file.
python – OSError: [Errno 8] Exec format error
Have you tried this?
Out = subprocess.Popen(/usr/local/bin/script hostname = actual_server_name -p LONGLIST.split(), shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
Edited per the apt comment from @J.F.Sebastian