Reputation: 2067
Yesterday, I wrote and ran a python script
which executes a shell
using subprocess.Popen(command.split())
where command is string which constitutes .sh
script and its argument. This script was working fine until yesterday. Today, I ran the same script and now I am continuously hitting this error.
p=subprocess.Popen(shell_command.split())
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
raise child_exception
OSError: [Errno 8] Exec format error
I know there are similar questions that have been asked before related to this question, but in my case I tried everything which doesn't solve my purpose. Using shell=True
does not work because my shell script calls an another shell script before which some environment has to be set in order to run that script. I am badly stuck in this. I just restart my system once. I am using ubuntu 12.04
EDIT:
import subprocess
import os
import sys
arg1=sys.argv[1]
arg2=sys.argve[2]
shell_command = 'my_path/my_shell.sh ' + arg1 + ' '+ arg2
P = subprocess.Popen(shell_command.split())
P.wait()
my_shell.sh:
arg1=$1
arg2=$2
cd $TOP
setup the environment and run shell script
build the kernel ...
execute shell command .....
Upvotes: 71
Views: 97507
Reputation: 21
I am currently facing the same issue. I noticed that using shell=True
argument, like subprocess.Popen(shell_command.split(), shell=True)
works as inteded.
Upvotes: 1
Reputation: 131
The error is because the executables are not given in the prescribed format for subprocess to execute it.
example:
shell_command1 = r"/path/to/executable/shell/file"
shell_command2 = r"./path/to/executable/shell/file"
subprocess.call(shell_command1)
or subprocess.Popen(shell_command1)
will not be able to run shell_command1 because subprocess needs an executable command like (mailx, ls, ping, etc.) or executable script like shell_command2 or you need to specify command like this
subprocess.call(["sh", shell_command1])
subprocess.Popen(["sh", shell_command1])
but however, you can use os.system()
or os.Popen()
as well
Upvotes: 3
Reputation: 974
This can also happen if the binary is not meant to run on your system.
I'm on OSX, but the binary I was running is not meant for OSX, as I saw from using file path/to/binary
:
webui/bin/wkhtmltopdf: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.18, BuildID[sha1]=b6566a9e44c43a0eebf18d8c1dc6cb616801a77e, stripped
Upvotes: 4
Reputation: 83
It is recommended to install the package binfmt-support to help the system better recognize the scipts. It helps regardless of whether they have a shebang line.
Upvotes: -1
Reputation: 3673
I solved this by putting this line at the top of the called shell script:
#!/bin/sh
That will guarantee that the system always uses the correct interpreter when running your script.
Upvotes: 138
Reputation: 317
Following statement worked for me
subprocess.Popen(['sh','my_script.sh'])
Upvotes: 24
Reputation: 4742
As @tripleee said, there is an issue executing your script. Make sure:
See also: Why is '#!/usr/bin/env python' supposedly more correct than just '#!/usr/bin/python'?
Upvotes: 4
Reputation: 189387
The error message suggests that the external program is not a valid executable.
Upvotes: 4