Запуск модулей в качестве подпроцессов в фоновом режиме и отсоединение

В bash я могу сделать следующее:

for f in subdir/*.sh; do
    nohup "$f" "[email protected]" &> /dev/null &
done
Другими словами, он запускает все *.sh скрипты в subdir в фоновом режиме и отделяется, так что если главный script заканчивается, фоновые сценарии не будут завершены.

Теперь скажем, у меня есть следующий проект Python:

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

Как мне сделать что-то похожее на bash script? Но с параметрами, переданными как объекты Python?

Например: у меня есть две строки a и b, список 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_a, mod_b и mod_c работать в фоновом режиме до завершения

Ответ 1

Чтобы эмулировать nohup в Python, вы можете заставить дочерние процессы игнорировать сигнал SIGHUP:

import signal

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

i.e., чтобы эмулировать bash script:

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

с использованием модуля subprocess в 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)

Чтобы создать подходящих демонов, вы можете использовать python-daemon package.

Ответ 2

Я не знаю о каком-либо механизме для него в python, но вы можете попробовать использовать nohup. Вы можете попробовать запустить

nohup python your_script.py arguments

Использование os.system или subprocess.call.