我正在尝试从Linux中的hcitools读取命令输出(它扫描蓝牙设备)。
我只需要阅读它返回的第一行,因为有时这个工具有错误。问题是这个工具继续在无限循环中运行,这会锁定我的其余Python脚本。该脚本使用sudo运行,因此它具有使用hcitool命令的root权限。
我创建了一个类来尝试异步管道数据:
class ASyncThread(threading.Thread): #pOpen read and readline are blocking. So we must use an async thread to read from hciTool
def __init__(self, command, parameters = []):
self.stdout = None
self.stderr = None
self.command = command
self.parameters = parameters
self.process = None
threading.Thread.__init__(self)
def run(self):
if len(self.command) >= 1:
self.process = subprocess.Popen([self.command] + self.parameters, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
self.stdout, self.stderr = self.process.communicate()
else:
print "[ASyncThread::run()] Error: Empty command given."
def terminate(self):
try:
self.process.terminate()
except Exception, ex:
print "[ASyncThread::terminate()] Error: ", ex
我称之为:
print "Checking HCI Tool Status..."
hciThread = ASyncThread("/usr/local/bin/hciconfig", ["lescan"])
hciThread.start()
time.sleep(1) #Give the program time to run.
hciThread.terminate() #If terminate is not placed here, it locks up my Python script when the thread is joined.
hciThread.join()
outputText = hciThread.stdout + " | " + hciThread.stderr
运行此命令时,输出只是“|”。 如果我运行此命令:
sudo /usr/local/bin/hcitool lescan
立即开始工作:
slyke@ubuntu ~ $ sudo hcitool lescan
Set scan parameters failed: Input/output error
我已经在这个工作了几个小时了。我最初尝试使用pOpen执行此操作,但read()和readline()都是阻塞的。这通常不是问题,除了可能没有错误或此命令产生的任何数据,因此我的Python脚本挂起。这就是为什么我转向线程,所以它可以在停止之前等待一秒钟,然后继续。
答案 0 :(得分:0)
在我看来,在上一行刚刚终止线程之后,您可能无法加入该线程。
使用mikerr / btle-scan.py-https://gist.github.com/mikerr/372911c955e2a94b96089fbc300c2b5d
的解决方案可能会更好地解决您有关进行lescan的特定问题