如何从python脚本中的运行命令中提取输出?

时间:2015-06-23 16:25:38

标签: python raspberry-pi

是否可以从子进程中运行的命令中提取实时输出?

我想在我的脚本中使用名为wifite(https://github.com/derv82/wifite)的程序的输出。 Wifite应该在我的脚本中的子进程中运行 - 在特定时间,wifite将输出它的扫描结果并每秒更新它们(或接近它的东西)。我想在我的Raspberry Pi Adafruit液晶显示器上显示这条输出线。

所以我想做这样的事情:

wifite_scan = subprocess.Popen('./wifite.py', shell=True, stdout =PIPE)
wfite_scanOut= wifite_scan.communicate()
lcd.message(wifite_scanOut)

但这不起作用(纠正我,如果我错了)活着。

...要在我的lcd上获取此输出的最后一行:

1  Example1               7  WPA2  58db   wps 
2  Example2               6  WPA2  47db    no 
3  Example4               7  WPA2  47db    no 
4  Example5               1  WPA2  31db    no 

[0:00:11] scanning wireless networks. 4 targets and 0 clients found

此输出每5秒更新一次,并在控制台中使用新值发布相同的输出。所以我需要一种方法来在变量中每隔5秒获取最后一行。

什么是实现液晶显示器实时输出的最佳方式?

2 个答案:

答案 0 :(得分:0)

曾经尝试pexpect?我已成功地将它与各种软件一起使用。

示例 - 使用mysql客户端计算test的表的数量(必须至少有一个表不能中断):

child = pexpect.spawn('mysql')
child.expect('mysql>')
child.sendline('use test; show tables;')
child.expect('(\d+) row.* in set \(.*\)')
count_tables = child.match.groups()[0]

致电expect(expr)后,您可以使用child.beforechild.buffer检查缓冲区的内容。

答案 1 :(得分:0)

我不确定它是否适合你的问题(因为我不知道下标的输出是什么样的),但这可能是一个解决方案:

import subprocess

wifite_scan = subprocess.Popen('wifite.py', shell=True, stdout=subprocess.PIPE)
while True:
    output = wifite_scan.stdout.readline()
    if output == '':
        # end of stream
        print("End of Stream")
        break
    if output is not None:
        # here you could do whatever you want with the output.
        print("Output Read: "+output)

我用一个生成一些输出的简单文件尝试了上面的脚本:

# wifite.py
import time

for i in range(10):
    print(i)
    time.sleep(1)

为我工作。