我已经在python中与Popen战斗了几天,所以我决定把我所有的疑问放在这里,希望所有这些都可以被python专家澄清。
最初,我使用 Popen 执行命令并 grep 结果(作为一个使用管道的命令,例如xxx | grep yyy
),shell=False
正如您可以想象的那样,这不太好用。按照这篇文章中的指南,我将代码更改为以下内容:
checkCmd = ["sudo", "pyrit", "-r", self.capFile, "analyze"]
checkExec = Popen(checkCmd, shell=False, stdout=PIPE, stderr=STDOUT)
grepExec = Popen(["grep", "good"], stdin=checkExec.stdout, stdout=PIPE)
output = grepExec.stdout.readline()
output = grepExec.communicate()[0]
但是我意识到checkExec
运行速度很慢,并且由于 Popen 是非阻塞的,因此grepExec
总是在显示任何结果之前执行checkExec
,因此 grep 输出将始终为空白。我怎样才能推迟执行grepExec
直到checkExec
完成?
在我程序的另一个 Popen 中,我试图在后面保持一个服务打开,所以我使用一个单独的线程来执行它。完成所有任务后,我通知该线程退出,并显式调用 Popen.kill() 停止服务。但是,我的系统最终会出现一个没有收割的僵尸进程。不知道有没有什么好办法可以在后台线程完成后清理掉所有的东西?
Popen.communicate()[0] 和 Popen.stdout.readline() 有什么区别?我可以使用循环来继续读取它们的输出吗?