gpt4 book ai didi

Python 非阻塞读取命令

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:34 25 4
gpt4 key购买 nike

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

最佳答案

在我看来,你不可能加入一个线程,因为你刚刚在上面的行中终止了它。

使用 mikerr/btle-scan.py - https://gist.github.com/mikerr/372911c955e2a94b96089fbc300c2b5d 中的解决方案可能会更好地解决您关于执行 lescan 的特定问题。

关于Python 非阻塞读取命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28009929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com