从进程中收集常量输出(Python)

时间:2014-12-16 13:55:36

标签: python subprocess stdout popen bluez

我有一个生成常量输出(hcitool lescan)的程序:

CC:41:00:4D:AA:AA Name1
CC:41:00:4D:AA:BB Name2
CC:41:00:4D:AA:CC Name3

我想在Python中不断解析此输出,但几秒后我想要终止该过程。 由于必须手动终止(通过按CTRL-C),我无法使用subprocess.check_value(["prog"])。同时调用p = subprocess.Popen(["prog"], stdout=subprocess.PIPE)并不好,因为它命令Popen将其读取到EOF。此外,此类调用会挂起Python脚本。

我的问题是:如何在Python(可以限制为Linux环境)中启动程序,并在收集它的输出后从几秒钟后终止它(来自{{1} }})?

2 个答案:

答案 0 :(得分:0)

根据您的程序正在执行的操作,您可以使用几种方法。

第一个是将进程置于while循环中并检查lescan输出文件中的MAC地址。

import os

tag = 0
while tag != "00:11:22:33:44:55":
    open("file.txt","w").close()
    os.system("hcitool lescan> file.txt"+" & pkill --signal SIGINT hcitool")
    f = open("file.txt","r")
    read = f.read()
    if "00:11:22:33:44:55" in read:
        print "found"
        tag = "00:11:22:33:44:55"
print "program finished"
os._exit(0)

第二种解决方案是,如果您同时使用lescanhcidump

import time
import os
import subprocess

d = subprocess.Popen(["sudo hcitool lescan --duplicates & sudo hcidump -w dump.txt"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
time.sleep(3)
dump = os.system("sudo hcidump -r dump.txt>scan.txt")
#read the file like the previous solution I shown you
print "program finished"
os._exit(0)

我发现这样做的最好方法是将读数输出到文件中,并扫描文件以查找您正在寻找的任何特定内容。

如果您需要任何具体内容,请回复一下,不过我认为我已经覆盖了您的问题。

答案 1 :(得分:0)

只要您运行的子进程持续产生输出,这就应该有效。你可以随时用Ctrl-C结束它。

(注册J.F.塞巴斯蒂安的明智建议)

import subprocess

p = subprocess.Popen(['hcitool', 'lescan'],stdout=subprocess.PIPE,bufsize=1)

try:
    for line in iter(p.stdout.readline, ""):
        print line, # Do watever processing you want to do here
except KeyboardInterrupt:
    p.kill()

p.wait()
p.stdout.close()