我有一个打开子进程并将输出写入文件的代码:
logPath = '/path/to/some/directory/'
log = open(logPath + 'log', 'a')
guipid = subprocess.Popen(SomeGuiApplication, stdout = log, stderr = subprocess.STDOUT).pid
这就引出了预期的应用程序,它就是gui。当我关闭gui时,gui的输出将正确地显示在日志中。
我还有一段代码列出gui应用程序的所有实例,并用os.kill()函数关闭它们:
for line in os.popen("ps xa"):
fields = line.split()
pid = fields[0]
process = fields[4]
if process.find(SomeGuiApplication) > 0:
os.kill(int(pid), signal.SIGTERM)
当我使用os.kill()方法关闭gui应用程序时,只将gui应用程序输出的第一行记录到日志中。我试过(每一次?)在https://docs.python.org/3/library/signal.html中将信号类型定义为os.kill()的输入,但是我得到了相同的结果。为什么来自Popen的stdout流的行为与显式调用信号与我手动关闭gui时不同?
我使用的是RHEL7和python3.6。GUI应用程序是在Qt5中构建的;它使用标准Ui::MainWindow构造。析构函数只调用'delete ui;‘
注意:我知道我可以进行一些重写,让Popen调用使用stdout =管道,然后在“实时”中将这些行写到文件中,但是这需要父进程在子进程的持续时间内保持运行。这是我想要避免的事情。
发布于 2022-01-20 06:53:37
我假设进程的输出是缓冲的,并且由于您杀死了它,所以没有机会将它的输出刷新到stdout
。
您可能会尝试将Popen
的Popen
参数更改为0
,这将使输出没有缓冲:
guipid = subprocess.Popen(SomeGuiApplication, stdout = log, stderr = subprocess.STDOUT, bufsize=0).pid
我建议阅读文档以更好地理解你应该做什么。
https://stackoverflow.com/questions/70788038
复制