发送SIGINT后从子流程捕获stdout

2024-05-13 18:36:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个通过python脚本运行的dtrace代码段,dtrace代码段可以在向其发出CTRL-C时生成数据。因此,我在python脚本中定义了一个signal_处理程序,用于从用户处捕获CTRL-C并将其转发到通过以下方式完成的dtrace调用子流程.Popen但我无法在日志文件中获得任何输出。脚本如下:

Proc = []
signal_posted = False

def signal_handler(sig, frame):
    print("Got CTRL-C!")
    global signal_posted
    signal_posted = True
    global Proc
    Proc.send_signal(signal.SIGINT) #Signal posting from handler

def execute_hotkernel():
    #
    # Generate the .out output file
    #
    fileout = "hotkernel.out"
    fileo = open(fileout, "w+")

    global Proc
    Proc = subprocess.Popen(['/usr/sbin/dtrace', '-n', dtrace_script], stdout = fileo)
    while Proc.poll() is None:
        time.sleep(0.5)

def main():
    signal.signal(signal.SIGINT, signal_handler)        # Change our signal handler
    execute_hotkernel()

if __name__ == '__main__':
    main()

因为我有档案热内核.out开始子流程.Popen我期望dtrace的输出被重定向到stdout的命令热内核.out执行CTRL-C操作时,它是空的。这里少了什么?在


Tags: 脚本signalmaindef代码段流程procout
1条回答
网友
1楼 · 发布于 2024-05-13 18:36:26

我也有类似的问题。在

在我的例子中,它是一个shell脚本,运行到您点击Control-C,然后打印出摘要信息。当我使用子流程.Popen,无论是对stdout使用管道还是文件对象,我要么无法获取信息(使用file对象),要么在尝试运行时挂起标准输出读取线(). 在

最后,我尝试从解释器运行子进程,发现如果我调用,就可以用管道获得SIGINT之后的最后一行输出标准输出读取线()(在它挂起的地方)并点击Control-C(在解释器中),然后调用标准输出读取线再次。在

我不知道如何在脚本、文件输出或管道中模拟这一点。我没有在解释器中尝试文件输出。在

编辑: 我终于回到这一点,并决定,在python之外进行模拟实际上非常容易,实际上与python无关。在

/some_cmd_that_ends_on_sigint
(enter control-c)
*data from stdout in event handler*

作品

^{pr2}$

我的日志呢?在

最后,我只是在事件处理程序中添加了一个文件流(在some_cmd_中,该文件流在μsigint源上结束),它将数据写入(可能是辅助)日志。工作,如果有点尴尬。如果不使用任何管道运行,您可以在屏幕上获取数据,但是我也可以在管道连接时或从辅助日志中从python读取数据。在

相关问题 更多 >