I have a Python script that needs to invoke another Python script in the same directory. I did this:
from subprocess import call
call('somescript.py')
I get the following error:
call('somescript.py')
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 2] No such file or directory
I have the script somescript.py in the same folder though. Am I missing something here?
Windows? Unix?
Unix will need a shebang and exec attribute to work:
as the first line of script and:
at command-line or
as mentioned previously.
Windows should work if you add the shell=True parameter to the "call" call.
If 'somescript.py' isn't something you could normally execute directly from the command line (I.e.,
$: somescript.py
works), then you can't call it directly using call.Remember that the way Popen works is that the first argument is the program that it executes, and the rest are the arguments passed to that program. In this case, the program is actually python, not your script. So the following will work as you expect:
This correctly calls the Python interpreter and tells it to execute your script with the given arguments.
Note that this is different from the above suggestion:
That will try to execute the program called python somscript.py, which clearly doesn't exist.
Will also work, but using strings as input to call is not cross platform, is dangerous if you aren't the one building the string, and should generally be avoided if at all possible.
If you're on Linux/Unix you could avoid call() altogether and not execute an entirely new instance of the Python executable and its environment.
For what it's worth.
The subprocess call is a very literal-minded system call. it can be used for any generic process...hence does not know what to do with a Python script automatically.
Try
If that doesn't work, you might want to try an absolute path, and/or check permissions on your Python script...the typical fun stuff.
What's wrong with
or better still wrap the functionality in a function, e.g. baz, then do this.
There seem to be a lot of scripts starting python processes or forking, is that a requirement?