如何执行一个terminal命令,然后用Python反复检查和存储响应?

如何执行一个terminal命令,然后用Python反复检查和存储响应?,python,Python,我有一个终端命令要运行一次。基本上,当您执行该命令时,程序会持续运行,直到有人告诉您其他情况。当程序运行时,它将继续向终端输出文本字符串。我想以某种方式将这些字符串存储为变量,以便检查它是否包含特定的关键字。 我尝试使用os.system,但遗憾的是,它没有存储程序的响应。 提前感谢,我很抱歉我的天真要生成运行命令的子进程,请使用subprocess.Popen: proc = subprocess.Popen(['cat', 'myfile'], stdout = subprocess.PIP

我有一个终端命令要运行一次。基本上,当您执行该命令时,程序会持续运行,直到有人告诉您其他情况。当程序运行时,它将继续向终端输出文本字符串。我想以某种方式将这些字符串存储为变量,以便检查它是否包含特定的关键字。 我尝试使用os.system,但遗憾的是,它没有存储程序的响应。
提前感谢,我很抱歉我的天真

要生成运行命令的子进程,请使用
subprocess.Popen

proc = subprocess.Popen(['cat', 'myfile'], stdout = subprocess.PIPE)
通过将
stdout
设置为
PIPE
,您将使
cat
通过您控制的通道输出文本

Popen
返回时,
proc.stdout
将是一个类似于
文件的对象,您可以
read()
。为了方便起见,它还公开了
readline()

readline()
返回流的下一行,
\n
位于包含的末尾。当它返回
'
时,就没有什么可读的了

line = proc.stdout.readline()

while line != '':
    print line
您还可以创建一个行迭代器来逐行遍历输出。您可以将此迭代器提供给其他函数,这些函数随后可以使用子流程的输出,而无需直接与流程对象交互:

iterator = iter(proc.stdout.readline, '')

# Somewhere else in your program...
for line in iterator:
    print line

是否将响应发送到STDOUT/STDERR
subprocess
模块公开了一个
check\u output
函数,该函数返回您可能能够解析的STDOUT/STDERR文本。(即,
子流程。检查输出(arg).split(“\n”)
)相关问题:@AnthonyForloney-不要这样做。check_output缓冲整个输出,然后在命令完成后返回。非常有见解,谢谢。恐怕我的Popen参数有误。当我使用stdout=subprocess.PIPE时,它会给我一个错误。它应该是stdout=PIPE吗?@A_toaster您是如何导入
子流程的?如果您确实导入了subprocess.Popen
或subprocess import Popen
中的
,则
管道
变量将不起作用。只需执行导入子流程
,您就可以访问它的所有组件。