在后台启动模块作为子进程,并分离

时间:2014-12-17 08:57:56

标签: python subprocess detach

bash中,我可以执行以下操作:

for f in subdir/*.sh; do
    nohup "$f" "$@" &> /dev/null &
done

换句话说,它在后台运行*.sh中的所有subdir脚本,并分离,以便在主脚本结束时,后台脚本不会被终止。

现在,假设我有以下Python项目:

proj/
    __init__.py
    main.py
    subdir/
        __init__.py
        mod_a.py
        mod_b.py
        mod_c.py

如何执行与bash脚本类似的操作?但是参数作为Python对象传递?

例如:我有两个字符串ab,一个列表l和一个字典d

  • 加载mod_a.py,调用mod_a.main(a, b, l, d),然后分离
  • 加载mod_b.py,调用mod_b.main(a, b, l, d),然后分离
  • 加载mod_c.py,调用mod_c.main(a, b, l, d),然后分离
  • main.py可以结束,让mod_amod_bmod_c在后​​台运行直至完成

3 个答案:

答案 0 :(得分:1)

要在Python中模拟nohup,您可以让子进程忽略SIGHUP信号:

import signal

def ignore_sighup():
    signal.signal(signal.SIGHUP, signal.SIG_IGN)

即模仿bash脚本:

#!/bin/bash
for f in subdir/*.sh; do
    nohup "$f" "$@" &> /dev/null &
done

在Python中使用subprocess模块:

#!/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)

要创建正确的守护进程,可以使用python-daemon package

答案 1 :(得分:0)

我不知道python中的任何机制,但您可以尝试使用nohup。您可以尝试运行

nohup python your_script.py arguments

使用os.systemsubprocess.call

答案 2 :(得分:0)

它可能是Run a program from python, and have it continue to run after the script is killed的副本而且没有,忽略SIGHUP没有帮助,但是preexec_fn = os.setpgrp可以。