我有一个生成常量输出(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} }})?
答案 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)
第二种解决方案是,如果您同时使用lescan
和hcidump
。
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()