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
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 ofgo.sh
is not valid.Here's a sample script that runs from the shell but not from
Popen
:Removing the
\
from the first line fixes the problem.Change the code to following:
Notice "shell=True"
From: http://docs.python.org/library/subprocess.html#module-subprocess
I recently ran into this problem with a script that looked like this:
The script ran fine from the command line, but failed with
when executed via
(The solution, of course, was to remove the empty line).
Yes, this is the preferred way to execute something..
Since you are passing all arguments through an array (which will be used gor an exec()-style call internally) and not as an argument string evaluated by a shell it's also very secure as injection of shell commands is impossible.
Yes, that's perfectly fine if all you're doing is calling the shell script, waiting for it to complete, and gathering its exit status, while letting its stdin, stdout, and stderr be inherited from your Python process. If you need more control over any of those factors, then you just use the more general
subprocess.Popen
, but otherwise what you have is fine.call just invoke Popen,use wait() method wait the popenargs completes