写在()与p.terminate终止的进程

问题描述:

终止我与子其中p.terminate我开这样的SIGTERM日志文件:写在()与p.terminate终止的进程

p = Popen([sys.executable, args], stdin=PIPE, stdout=PIPE, stderr=open("error.txt", 'a')) 

正如你可以看到我全部重定向错误一个文本等等我可以阅读它。 我missused此功能可以打印的东西到这个文件时,子被终止:

signal.signal(signal.SIGTERM, sigterm_handler) # sets shutdown_flag 
while True: 
    if shutdown_flag: 
     print("Some Useful information", file=sys.stderr) 

但是:文件总是空的。这是因为调用terminate时管道被关闭,并且此时从子进程写入的任何内容都会丢失?还是有没有其他问题,我只是没有看到这里?

通常,终止线程并不是一个好主意。相反,你应该问它结束使用threading.Event。

event = threading.Event() 
while not event.isSet(): # use this instead of while True: 
    # do your stuff 

# now write your file 
print("Some Useful information", file=sys.stderr) 

然后,而不是p.terminate(),用途:

threading.Event().set() 
+0

我不使用线程,但子进程。它仍然以同样的方式工作吗? – Fuzzyma

+0

我的不好。我的大脑上有线程。 你可以做的是类似的。也就是说,告诉流程退出而不是杀死它。我会推荐使用p.communicate(“请关闭”)代替p.terminate() 然后,我不会在我的原始代码片段中等待事件,而是在标准输入中查找我们的数据并查找“请关闭”(或任何你想要的字符串)。 此外,重要的是,在p.communicate()之后,执行p.wait()。 – Martin

+0

这是不容易做到我的情况,因为我管道数据的过程。设置你的解决方案会混淆我想保持分离的数据流和控制流 – Fuzzyma