tags:

views:

135

answers:

4

I'm looking for a quick bash script or program that will allow me to kick off a python script in a separate process. What's the best way to do this? I know this is incredibly simple, just curious if there's a preferred way to do it.

+2  A: 

Your jargon is all confused. But in bash you can run a process in the background by appending a &:

print foo.py &
Ignacio Vazquez-Abrams
+1  A: 

The best way to do this is to do it in python! Have a look at the multiprocess libraries.

Here is a simple example from the links above:

from multiprocessing import Process

def f(name):
    print 'hello', name

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()
Shane C. Mason
+2  A: 

bash doesn't really do threads -- it does do processes just fine, though:

python whatever.py &

the & at the end just means "don't wait for the subprocess to end" -- bash will execute the command itself in a separate process anyway, it's just that normally it waits for that separate process to terminate (all Unix shells work that way since time immemorial).

Alex Martelli
+7  A: 

Just use the ampersand (&) in order to launch the Python process in the background. Python already is executed in a separate process from the BASH script, so saying to run it "in a separate thread" doesn't make much sense -- I'm assuming you simply want it to run in the background:

#! /bin/bash
python path/to/python/program.py &

Note that the above may result in text being printed to the console. You can get around this by using redirection to redirect both stdout and stderr to a file. For example:

#! /bin/bash
python path/to/python/program.py > results.txt 2> errors.log &
Michael Aaron Safyan
Where you say "stdin" I assume you mean "stderr" and it should be `2>errors.log` (without the ampersand after the "2").
Dennis Williamson
@Dennis, oops. Thanks. Good catch. I've updated accordingly.
Michael Aaron Safyan
Yah, this is what I was expecting. Thanks!
Bialecki