一段时间以来,我一直在尝试各种方法来使用 python 的子进程包启动和运行 RFCOMM 服务器,但遇到了困难。我想做的是在后台启动一个进程,运行这个 RFCOMM 服务器并从命令中获得通常的返回,类似于"将/dev/rfcomm0 连接到通道 n 上的 xx:xx:xx:xx:xx:xx"和"按 CTRL-C 挂断"。问题是,这个过程从我尝试过的两种不同方式开始,但获得这种回报并让它坐在后台对我来说是一个问题。
备选方案1:
ref = Popen("sudo rfcomm connect 0 xx:xx:xx:xx:xx:xx 1 -i hci0 &", stdout=PIPE, stderr=PIPE, shell=True)
上面启动了RFCOMM服务器,但是如果我使用communication()或尝试从ref.stdout/stderr读取,程序就会冻结。
备选方案2:
res = run("sudo rfcomm connect 0 xx:xx:xx:xx:xx:xx 1 -i hci0 &", stdout=PIPE, stderr=PIPE, shell=True)
同样的事情,如果我尝试访问 CompleteProcess 对象 stdout/stderr 字段,程序会冻结并拒绝继续。RFCOMM 服务器启动,但脚本未终止,我无法读取 stdout/stderr 字段。
备选方案3:
res = run(["sudo", "rfcomm", "connect", "0", "xx:xx:xx:xx:xx:xx", "1", "-i", "hci0"], stdout=PIPE, stderr=PIPE)
同样的事情在这里,即使 shell 保留为其默认值并且命令不在后台运行,run 函数也不会返回,脚本也不会终止。RFCOMM 服务器启动,但脚本未终止,我无法读取 stdout/stderr 字段。
因此,我想要的是后台启动此RFCOMM服务器,阅读它应显示的两行,然后继续我的程序,以便我可以通过其他命令轮询其可用性。
在我看来,这个答案很奇怪,但答案在于我将 stdout 和 stderr 分配给 PIPE 常量。出于某种原因,这会将脚本"绑定"到执行,并且不会让它完成。删除这两个作业时,脚本愉快地完成,我必须找到另一种方法来获得我在问题中列出的我想要的输出,"已连接..."消息就是。似乎我暂时没有办法检索它。
在后台工作并启动服务器的脚本:
mac_addr = "xx:xx:xx:xx:xx:xx"
run("sudo rfcomm connect 0 " + mac_addr + " 1 -i hci0 &", shell=True)
所以,正如你所看到的,我刚刚删除了标准输出和标准...如果有人反过来可以回答为什么这基本上会"锁定"脚本,我将不胜感激。