问题
In bash
, I can do the following:
for f in subdir/*.sh; do
nohup "$f" "$@" &> /dev/null &
done
in other words, it runs all *.sh
scripts in subdir
in the background, and detached so that if the main script ends, the background scripts won't be terminated.
Now, let's say I have the following Python project:
proj/
__init__.py
main.py
subdir/
__init__.py
mod_a.py
mod_b.py
mod_c.py
How do I do something similar to the bash script? But with parameters passed as Python objects?
E.g.: I have two strings a
and b
, a list l
, and a dictionary d
- Load
mod_a.py
, invokemod_a.main(a, b, l, d)
, and detach - Load
mod_b.py
, invokemod_b.main(a, b, l, d)
, and detach - Load
mod_c.py
, invokemod_c.main(a, b, l, d)
, and detach main.py
can end, lettingmod_a
,mod_b
, andmod_c
run in the background until completion
回答1:
To emulate nohup
in Python, you could make child processes to ignore SIGHUP
signal:
import signal
def ignore_sighup():
signal.signal(signal.SIGHUP, signal.SIG_IGN)
i.e., to emulate the bash script:
#!/bin/bash
for f in subdir/*.sh; do
nohup "$f" "$@" &> /dev/null &
done
using subprocess
module in Python:
#!/usr/bin/env python3
import sys
from glob import glob
from subprocess import Popen, DEVNULL, STDOUT
for path in glob('subdir/*.sh'):
Popen([path] + sys.argv[1:],
stdout=DEVNULL, stderr=STDOUT, preexec_fn=ignore_sighup)
To create proper daemons, you could use python-daemon package.
回答2:
I don't know about any mechanism for it in python, but you may try to use nohup
. You may try to run
nohup python your_script.py arguments
Using os.system
or subprocess.call
.
回答3:
It's probably a duplicate of Run a program from python, and have it continue to run after the script is killed and no, ignoring SIGHUP doesn't help, but preexec_fn=os.setpgrp does.
来源:https://stackoverflow.com/questions/27521639/launch-modules-as-subprocesses-in-the-background-and-detach