快速简单:我正在使用 subprocess.popen 调用一个进程,它将在 cmd/terminal 中连续运行。如果某个文本字符串显示在 cmd/终端中,我想调用一个函数。我该怎么做?我对 python 比较陌生,所以最简单的解决方案可能是最好的解决方案。
非常感谢!
快速简单:我正在使用 subprocess.popen 调用一个进程,它将在 cmd/terminal 中连续运行。如果某个文本字符串显示在 cmd/终端中,我想调用一个函数。我该怎么做?我对 python 比较陌生,所以最简单的解决方案可能是最好的解决方案。
非常感谢!
您要查找的输出来自stdout
或stderr
。让我们假设它来自stdout
. (如果它来自stderr
解决方案是类似的;只需更改stdout
为stderr
, 下面。)
import subprocess
PIPE = subprocess.PIPE
proc = subprocess.Popen(['ls'], stdout=PIPE)
for line in iter(proc.stdout.readline, ''):
if line.startswith('a'):
print(line)
替换line.startswith('a')
为任何合适的条件,并且(当然)替换['ls']
为您想要的任何命令。
@unutbu 代码的唯一问题是(但这不适用于您的情况,它更普遍)是它在每次readline
调用时都会阻止您的应用程序。所以你不能做任何其他事情。
如果您想要一个非阻塞解决方案,您应该创建一个文件,以读写模式打开它,将写入器传递给Popen
读取器并从读取器读取。从阅读器读取将始终是非阻塞的。
import io
import time
import subprocess
filename = 'temp.file'
with io.open(filename, 'wb') as writer, io.open(filename, 'rb', 1) as reader:
process = subprocess.Popen(command, stdout=writer)
# Do whatever you want in your code
data = reader.read() # non-blocking read
# Do more stuff
data = reader.read() # another non-blocking read...
# ...
等等...
这不适用于@unutbu 的解决方案运行良好的特定情况。为了完整起见,我添加了它...