1

快速简单:我正在使用 subprocess.popen 调用一个进程,它将在 cmd/terminal 中连续运行。如果某个文本字符串显示在 cmd/终端中,我想调用一个函数。我该怎么做?我对 python 比较陌生,所以最简单的解决方案可能是最好的解决方案。

非常感谢!

4

2 回答 2

3

您要查找的输出来自stdoutstderr。让我们假设它来自stdout. (如果它来自stderr解决方案是类似的;只需更改stdoutstderr, 下面。)

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']为您想要的任何命令。

于 2013-08-24T21:14:46.103 回答
1

@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 的解决方案运行良好的特定情况。为了完整起见,我添加了它...

于 2013-08-24T21:14:59.040 回答