【问题标题】:programmatically executing and terminating a long-running batch process in python在 python 中以编程方式执行和终止长时间运行的批处理
【发布时间】:2010-09-09 20:50:06
【问题描述】:

我一直在寻找一种在 python 中启动和终止长期运行的“批处理作业”的方法。现在我正在使用“os.system()”在每个子进程中启动一个长时间运行的批处理作业。正如您可能已经猜到的那样,“os.system()”在该子进程(孙进程?)中生成了一个新进程,因此我无法从祖父进程中终止批处理作业。为我刚才描述的内容提供一些可视化:

Main (grandparent) process, with PID = AAAA
          |
          |------> child process with PID = BBBB
                         |
                         |------> os.system("some long-running batch file)
                                  [grandchild process, with PID = CCCC]

所以,我的问题是我无法从祖父母那里杀死孙子进程......

我的问题是,有没有办法在子进程中启动长时间运行的批处理作业,并且能够通过终止子进程来终止该批处理作业? 我可以使用哪些替代 os.system() 以便从主进程中终止批处理作业?

谢谢!!

【问题讨论】:

    标签: python operating-system batch-file subprocess multiprocessing


    【解决方案1】:

    subprocess 模块是在 Python 中生成和控制进程的正确方法。

    来自文档:

    子流程模块允许您 产生新的进程,连接到他们的 输入/输出/错误管道,并获得 他们的返回码。 这个模块 打算替换其他几个, 较旧的模块和功能,例如:

    os.system
    os.spawn
    os.popen
    popen2
    命令

    所以...如果您使用的是 Python 2.4+,subprocessos.system 的替代品

    要停止进程,请查看 Popen 对象的 terminate()communicate() 方法。

    【讨论】:

      【解决方案2】:

      如果您使用的是与 Posix 兼容的系统(例如,Linux 或 OS X)并且无需在子进程之后运行 Python 代码,请使用 os.execv。一般情况下,请避免使用os.system 并改用subprocess 模块。

      【讨论】:

        【解决方案3】:

        如果您想控制子进程的启动和停止,您必须使用线程。在这种情况下,只需查看 Python 的 threading 模块即可。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-19
          相关资源
          最近更新 更多