Python非阻塞读取命令

时间:2015-01-18 12:59:22

标签: python linux bluetooth

我正在尝试从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脚本挂起。这就是为什么我转向线程,所以它可以在停止之前等待一秒钟,然后继续。

1 个答案:

答案 0 :(得分:0)

在我看来,在上一行刚刚终止线程之后,您可能无法加入该线程。

使用mikerr / btle-scan.py-https://gist.github.com/mikerr/372911c955e2a94b96089fbc300c2b5d

的解决方案可能会更好地解决您有关进行lescan的特定问题