gpt4 book ai didi

python - 发送 SIGINT 后从子进程捕获标准输出

转载 作者:太空宇宙 更新时间:2023-11-03 18:13:12 26 4
gpt4 key购买 nike

我有一个通过 python 脚本运行的 dtrace 片段,并且该 dtrace 片段在向其发出 CTRL-C 时会生成数据。因此,我在 python 脚本中定义了一个 signal_handler 来捕获用户的 CTRL-C 并将其中继到通过 subprocess.Popen 完成的 dtrace 调用,但我无法在日志文件中获得任何输出。这是脚本:

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()

由于我在 stdout 的 subprocess.Popen 命令中设置了一个文件 hotkernel.out,因此我希望在执行 CTRL-C 时将 dtrace 的输出重定向到 hotkernel.out,但它是空的。这里缺少什么?

最佳答案

我也有类似的问题。

在我的例子中,它是一个 shell 脚本,它会一直运行,直到您按下 Control-C,然后打印出摘要信息。当我使用 subprocess.Popen 运行此命令时,无论是使用 PIPE 还是文件对象作为 stdout,我要么无法获取信息(使用文件对象),要么在我尝试运行 stdout.readline() 时挂起。

我最终尝试从解释器运行子进程,发现如果我调用 stdout.readline() (它挂起的地方)并按 Control-C (在解释器中),我可以使用 PIPE 获得 SIGINT 之后的最后一行输出),然后再次调用 stdout.readline()。

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

编辑:我终于回到了这一点并确定,它实际上很容易在 python 之外模拟,并且实际上与 python 无关。

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

作品

/some_cmd_that_ends_on_sigint | tee some.log
(enter control-c)
*Nothing sent to stdout in event handler prints to the screen or the log*

我的日志在哪里?

我最终只是在事件处理程序(在 some_cmd_that_ends_on_sigint 源中)中添加一个文件流,将数据写入(可能是辅助)日志。可以用,虽然有点尴尬。如果在没有任何管道的情况下运行,您可以在屏幕上获取数据,但我也可以在通过管道或从辅助日志中的 python 中读取它。

关于python - 发送 SIGINT 后从子进程捕获标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25499964/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com