如何执行一个terminal命令,然后用Python反复检查和存储响应?
我有一个终端命令要运行一次。基本上,当您执行该命令时,程序会持续运行,直到有人告诉您其他情况。当程序运行时,它将继续向终端输出文本字符串。我想以某种方式将这些字符串存储为变量,以便检查它是否包含特定的关键字。 我尝试使用os.system,但遗憾的是,它没有存储程序的响应。如何执行一个terminal命令,然后用Python反复检查和存储响应?,python,Python,我有一个终端命令要运行一次。基本上,当您执行该命令时,程序会持续运行,直到有人告诉您其他情况。当程序运行时,它将继续向终端输出文本字符串。我想以某种方式将这些字符串存储为变量,以便检查它是否包含特定的关键字。 我尝试使用os.system,但遗憾的是,它没有存储程序的响应。 提前感谢,我很抱歉我的天真要生成运行命令的子进程,请使用subprocess.Popen: proc = subprocess.Popen(['cat', 'myfile'], stdout = subprocess.PIP
提前感谢,我很抱歉我的天真要生成运行命令的子进程,请使用
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/STDERRsubprocess
模块公开了一个check\u output
函数,该函数返回您可能能够解析的STDOUT/STDERR文本。(即,子流程。检查输出(arg).split(“\n”)
)相关问题:@AnthonyForloney-不要这样做。check_output缓冲整个输出,然后在命令完成后返回。非常有见解,谢谢。恐怕我的Popen参数有误。当我使用stdout=subprocess.PIPE时,它会给我一个错误。它应该是stdout=PIPE吗?@A_toaster您是如何导入子流程的?如果您确实导入了subprocess.Popen
或subprocess import Popen
中的,则管道
变量将不起作用。只需执行导入子流程
,您就可以访问它的所有组件。