运行 RFCOMM 服务器在后台使用子进程

Running an RFCOMM server in the background using subprocess

一段时间以来,我一直在尝试各种方法来启动 RFCOMM 服务器并使用 python 的子进程包 运行ning,但遇到了瓶颈。我想要做的是在后台使用此 RFCOMM 服务器 运行ning 启动一个进程,并从类似于 "Connected /dev/rfcomm0 to xx:xx:xx:xx:xx:xx on channel n" 和 "Press CTRL-C for hangup" 的命令中获取通常的 return。问题是,这个过程以两种不同的方式开始,我已经尝试过,但是获取这个 return 并让它在后台运行对我来说是个问题。

备选方案 1:

ref = Popen("sudo rfcomm connect 0 xx:xx:xx:xx:xx:xx 1 -i hci0 &", stdout=PIPE, stderr=PIPE, shell=True)

上面启动了 RFCOMM 服务器,但是如果我使用 communicate() 或尝试从 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)

同样的事情,如果我尝试访问 CompletedProcess 对象 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 保留为默认值并且后台命令不是 运行,运行 函数不会 return 并且脚本不会终止。 RFCOMM 服务器启动但脚本没有终止,我无法读取 stdout/stderr 字段。

所以,我想要的是在后台启动这个 RFCOMM 服务器,读取它应该显示的两行,然后继续我的程序,以便我可以通过其他命令轮询它的可用性。

我认为这个答案很奇怪,但答案在于我将 stdout 和 stderr 分配给了 PIPE 常量。由于某种原因 "binds" 脚本要执行并且不会让它完成。当删除这两个分配时,脚本愉快地完成,我必须找到另一种方法来获得我在问题中列出的我想要的输出,即 "Connected ..." 消息。好像暂时没办法找回了。

在后台运行并启动服务器的脚本:

mac_addr = "xx:xx:xx:xx:xx:xx"

run("sudo rfcomm connect 0 " + mac_addr + " 1 -i hci0 &", shell=True)

因此,如您所见,我刚刚删除了 stdout 和 stderr...如果有人反过来可以回答为什么这基本上 "lock" 脚本,我将不胜感激。