Hcitool lescan将不会实时打印到文件中

更新:我使用os.system解决了我的解决scheme:

sensortag=0 while sensortag != "B4:99:4C:64:33:E0": #call the command and write to scan.txt file and then fill the process. #loop to find if the MAC address given is available os.system("hcitool lescan> scan.txt & pkill --signal SIGINT hcitool") scan = open("scan.txt","r") readscan = scan.read() if "B4:99:4C:64:33:E0" in readscan: print "SensorTag found." sensortag = "B4:99:4C:64:33:E0" 

我有两个程序,基本上是一样的,但有两个不同的命令,在Raspberry PI上运行Raspbian。

我想要做的是写两个命令输出到一个文件,所以我可以稍后处理它们。

我很困惑为什么第一个程序不能工作,但第二个程序会。

一个程序有一个“ sudo timeout 5 hcitool lescan ”命令,这是行不通的

 import os import subprocess #r+ because the file is already there, w without the file myfile = open("scan.txt", "r+") #Reset Bluetooth interface, hci0 os.system("sudo hciconfig hci0 down") os.system("sudo hciconfig hci0 up") #Scan for bluetooth devices dev = subprocess.Popen(["sudo timeout 5 hcitool lescan"], stdout=subprocess.PIPE, shell=True) (device, err) = dev.communicate() #Print bluetooth devices print device #Write the hcitool lescan output to a file myfile.write(device) #Close the file myfile.close() 

这里是我有第二个程序,它可以很好地打印“ sudo hciconfig ”:

 import os import subprocess #r+ because the file is already there, w without the file myfile = open("test.txt", "r+") #Reset Bluetooth interface, hci0 os.system("sudo hciconfig hci0 down") os.system("sudo hciconfig hci0 up") #Make sure device is up interface = subprocess.Popen(["sudo hciconfig"], stdout=subprocess.PIPE, shell=True) (int, err) = interface.communicate() #Print hciconfig to make sure it's up print int #Write the hciconfig output to a file myfile.write(int) #Close the file myfile.close() 

花了几个小时后,我想出了这个解决方案。 hcitool lescan的问题在于它在收到SIGINT之前不会返回,所以我们用Python发送一个:

  bashCommand = "hcitool lescan" process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE) time.sleep(3) os.kill(process.pid, signal.SIGINT) output = process.communicate()[0] 

这为我返回一个字符串包含所有发现的MAC地址,经过3秒的搜索。

我使用os.system解决了我的解决方案,并立即终止扫描:

 sensortag=0 while sensortag != "B4:99:4C:64:33:E0": #call the command and write to scan.txt file and then fill the process. #loop to find if the MAC address given is available os.system("hcitool lescan> scan.txt & pkill --signal SIGINT hcitool") scan = open("scan.txt","r") readscan = scan.read() if "B4:99:4C:64:33:E0" in readscan: print "SensorTag found." sensortag = "B4:99:4C:64:33:E0" 

只使用终端,下面的命令做了工作:

 hcitool lescan > scan.txt & sleep 2 && pkill --signal SIGINT hcito 

我会把它留在这里,也许这会帮助别人。