【问题标题】:Launch modules as subprocesses in the background, and detach在后台启动模块作为子进程,然后分离
【发布时间】:2015-02-15 18:26:07
【问题描述】:

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

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

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

现在,假设我有以下 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 在后台运行直到完成

【问题讨论】:

    标签: python subprocess detach


    【解决方案1】:

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

    nohup python your_script.py arguments
    

    使用os.systemsubprocess.call

    【讨论】:

      【解决方案2】:

      要在 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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        猜你喜欢
        • 2014-09-21
        • 2020-04-26
        • 2018-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多