【问题标题】:python kill subprocess communicate on exitpython kill subprocess 在退出时进行通信
【发布时间】:2012-11-22 07:01:56
【问题描述】:

我有一个大型脚本,旨在一次运行一项任务。但是我有一个初始化脚本,它使用 start-stop-daemon 在我们想要的任何时候终止脚本。脚本结束得很好,但是 subprocess 命令运行直到它完成。我怀疑这可能只是我如何尝试执行全局变量的问题。或者我使用 .communicate 与子进程。无论如何,这是代码中的相关内容:

import subprocess
import os
import signal

pro = ''

def sigHandler( signum, frame ):
    global pro
    os.killpg( pro.pid, signal.SIGTERM )
    sys.exit()

def run(data):
    #I found an example using preexec_fn somewhere on stackoverflow. Cant
    #remember if they were using .communicate() or not
    global pro
    pro = subprocess.Popen( command, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False, preexec_fn = os.setsid ).communicate()
    return( 1 )

if __name__ == '__main__':
    signal.signal( signal.SIGTERM, sigHandler )
    while True:
        run( relevantData )

【问题讨论】:

  • 似乎变量 pro 直到子进程完成才获取数据。因此,当 sigterm 在子进程运行时运行时,没有要杀死的 pid 数据。这可能是communicate() 的一个特性。我想改用 wait() 但我遇到了命令输出的缓冲区问题。

标签: python subprocess global kill


【解决方案1】:

朋友帮我弄明白了。正如我在评论中所说,当命令运行时 pro 没有被填充。所以我不得不把我的代码改成这样:

pro = subprocess.Popen( command, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False, preexec_fn = os.setsid )
pro.communicate()

然后它起作用了:)

【讨论】:

    猜你喜欢
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 2012-10-29
    • 2013-07-28
    • 1970-01-01
    相关资源
    最近更新 更多