如何将rfcomm shell命令的结果放入python中的变量中?
我在python中使用这个脚本是为了连接到蓝牙设备,然后获取数据,但我想知道这个shell命令的结果,以便进行下一步工作如何将rfcomm shell命令的结果放入python中的变量中?,python,variables,subprocess,rfcomm,Python,Variables,Subprocess,Rfcomm,我在python中使用这个脚本是为了连接到蓝牙设备,然后获取数据,但我想知道这个shell命令的结果,以便进行下一步工作 import os import time import signal import subprocess p = subprocess.Popen("sudo rfcomm connect /dev/rfcomm0 XX:XX:XX:XX:XX:XX 1",shell=True) (stderr,stdout) = p.communicate() print 'stde
import os
import time
import signal
import subprocess
p = subprocess.Popen("sudo rfcomm connect /dev/rfcomm0 XX:XX:XX:XX:XX:XX 1",shell=True)
(stderr,stdout) = p.communicate()
print 'stderr: [%s]' % stderr
print 'stdout: [%s]' % stdout
time.sleep(5)
while True:
print "Device is ready"
time.sleep(5)
以下代码是我运行命令时的示例:
"sudo rfcomm connect /dev/rfcomm0 XX:XX:XX:XX:XX:XX 1"
在shell中,它返回:
Connected /dev/rfcomm0 to XX:XX:XX:XX:XX:XX on channel 1
Press CTRL-C for hangup
但是,我如何将上述结果放入变量中,因为我需要知道此命令的结果?
我在子流程中使用stdout、stderr,但不起作用。
我正在使用python 2.7
上面提到的是在变量中获取输出,但我问题中的问题与rfcomm有关,rfcomm不会将其结果放入变量中,我运行了这些脚本,它们工作得很好,但如果使用的是Python 3.5或更高版本,当它与rfcomm命令一起使用时,它就不起作用了, 您可以使用。这样你就可以像这样直接访问
result = subprocess.run(["sudo rfcomm connect /dev/rfcomm0 XX:XX:XX:XX:XX:XX 1"], stdout=subprocess.PIPE)
然后像这样访问您想要的内容
result.stdout
如果您使用Python 2.7,正如我链接的文档所建议的那样,它们会将您重定向到该部分。
从那里你会发现你可以使用
注意,如果您想要捕获错误,也可以使用stderr=subprocess.STDOUT
标志
result = subprocess.check_output("sudo rfcomm connect /dev/rfcomm0 XX:XX:XX:XX:XX:XX 1", stderr=subprocess.STDOUT, shell=True)
Lasty有一个重要的问题你不应该知道
默认情况下,此函数将以编码字节的形式返回数据。输出数据的实际编码可能取决于所调用的命令,因此对文本的解码通常需要在应用程序级别处理
编辑
因为你的目标似乎是在跑步时获得输出。看看这个。我更喜欢连接而不是重新发明轮子 在返回数据之前,您可能需要发出CTRL+C命令
import os
import time
import signal
import subprocess
stream = []
try:
p = subprocess.Popen("sudo rfcomm connect /dev/rfcomm0 XX:XX:XX:XX:XX:XX 1",shell=True)
#(stderr, stdout) = p.communicate()
#print 'stderr: [%s]' % stderr
#print 'stdout: [%s]' % stdout
#time.sleep(5)
#print "Device is ready"
time.sleep(5)
os.kill(p.pid, signal.CTRL_C_EVENT)
p.wait()
except KeyboardInterrupt:
#except Exception:
for line in p.stdout: #May also be p.stderr
stream.append(line)
for x in stream:
print(x)
发送一个信号并捕获异常以处理返回的内容
import os
import time
import signal
import subprocess
stream = []
try:
p = subprocess.Popen("sudo rfcomm connect /dev/rfcomm0 XX:XX:XX:XX:XX:XX 1",shell=True)
#(stderr, stdout) = p.communicate()
#print 'stderr: [%s]' % stderr
#print 'stdout: [%s]' % stdout
#time.sleep(5)
#print "Device is ready"
time.sleep(5)
os.kill(p.pid, signal.CTRL_C_EVENT)
p.wait()
except KeyboardInterrupt:
#except Exception:
for line in p.stdout: #May also be p.stderr
stream.append(line)
for x in stream:
print(x)
期望的结果是什么?您想将通道1上的
Connected/dev/rfcomm0到XX:XX:XX:XX:XX:XX:XX:XX作为变量吗
是的,我需要将此结果或任何结果放入变量中,例如,错误结果放入变量您只需执行my_variable=stdout
实际可能重复的可能重复,我使用的是Python2.7run
和check\u输出只有在rfcomm
完成时才会完成。我的印象是OP希望流程保持运行并与之交互。@tripleee是的,我现在明白了。谢谢你的洞察力。我在编辑中链接了一个解决方案。的确,但正确的方法是将此问题指定为重复问题。我运行您的代码,但使用此脚本,它会在“连接/dev/rfcomm0到00:13:EF:C0:01:79频道1上按CTRL-C进行挂断”后等待,而不会转到“设备已准备就绪”您是否在执行循环时执行了?我确实运行了您的代码,并在运行了“p=subprocess.Popen(“sudo-rfcomm-connect/dev/rfcomm0-XX:XX:XX:XX:XX:XX:XX 1”,shell=True)”之后执行该操作。它会在通道1上返回Connected/dev/rfcomm0到00:13:EF:C0:01:79,然后按CTRL-C进行挂断“并等待无限如果你去掉这一行会发生什么呢?p.wait()
?我去掉了那一行,但没有发生。和以前一样