您的位置:

AssertionError("subprocess closed stdout but failed to " "get termination signal")的处理方案

  发布时间:2023-02-15 20:16:40
报错的原因这个错误一般是由于使用了Tornado的subprocess模块来执行子进程时,子进程的标准输出流已经关闭,但是没有收到终止信号。使用例子当使用subprocess.Popen来执行子进程时,可以使用如下代码来等待子进程终止这里的`p.wait()`会阻塞当前线程,直到子进程终止。在子进程终止后,stdout和stderr可以安全地关闭。

报错的原因

这个错误一般是由于使用了Tornado的subprocess模块来执行子进程时,子进程的标准输出流已经关闭,但是没有收到终止信号。这通常是由于子进程在关闭标准输出流之前就已经终止了,导致Tornado无法收到终止信号。

如何解决

解决这个问题的方法有很多,常见的做法有:

- 检查子进程的代码,确保在关闭标准输出流之前已经发送了终止信号

- 如果子进程是外部命令,可以尝试在命令行中执行它,看看是否有输出,如果没有输出可以考虑重新配置它

- 可以考虑在使用subprocess模块时使用其他参数,例如stderr、stdin等来替代stdout,

- 如果上述方法都不能解决问题,可以考虑使用其他库(例如subprocess32,subprocess,psutil)来执行子进程

- 也可以考虑在程序中手动等待子进程终止,在确保子进程已经终止后再关闭标准输出流。

请注意,这些建议仅是一般性的建议,具体的解决方案将取决于您的应用程序的结构和实现。

使用例子

当使用subprocess.Popen来执行子进程时,可以使用如下代码来等待子进程终止:


import subprocess

# Start the process
p = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# Wait for the process to terminate
p.wait()

# Close the stdout and stderr
p.stdout.close()
p.stderr.close()

这里的`p.wait()`会阻塞当前线程,直到子进程终止。在子进程终止后,stdout和stderr可以安全地关闭。

对于其他库如psutil,可以用如下代码来等待子进程终止:


import psutil

# Start the process
p = subprocess.Popen(["ls", "-l"])

# Wait for the process to terminate
psutil.wait_procs([p], timeout=None)

# Close the stdout and stderr
p.stdout.close()
p.stderr.close()

这里的psutil.wait_procs([p], timeout=None)会等待子进程终止。

请注意,这些代码仅供参考,具体的实现可能会有所不同。