Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is this the right way to run a shell script inside Python?

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

When I run these 2 lines, will I be doing exactly this?:

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

Why do I get this error? But when I run go.sh normally, I don't get that 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 
like image 972
TIMEX Avatar asked Jan 29 '11 01:01

TIMEX


People also ask

Can we run shell script in Python?

If you need to execute a shell command with Python, there are two ways. You can either use the subprocess module or the RunShellCommand() function. The first option is easier to run one line of code and then exit, but it isn't as flexible when using arguments or producing text output.

How do I run a shell file in Python?

To run Python scripts with the python command, you need to open a command-line and type in the word python , or python3 if you have both versions, followed by the path to your script, just like this: $ python3 hello.py Hello World!

How do I run a bash script in Python?

import subprocess process = subprocess. Popen(["ls", "-la"]) print("Completed!") Run the above code and observe the output. You will see that the message Completed! is printed before the execution of the command.


2 Answers

OSError: [Errno 8] Exec format error

This is an error reported by the operating system when trying to run /home/myuser/go.sh.

It looks to me like the shebang (#!) line of go.sh is not valid.

Here's a sample script that runs from the shell but not from Popen:

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

Removing the \ from the first line fixes the problem.

like image 154
Johnsyweb Avatar answered Sep 17 '22 12:09

Johnsyweb


Change the code to following:

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

Notice "shell=True"

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

On Unix, with shell=True: If args is a string, it specifies the command string to execute through the shell. This means that the string must be formatted exactly as it would be when typed at the shell prompt.

like image 38
jbp Avatar answered Sep 19 '22 12:09

jbp