我正在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 '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"
在外壳中,它返回:
Connected /dev/rfcomm0 to XX:XX:XX:XX:XX:XX on channel 1
Press CTRL-C for hangup
但是由于我需要知道此命令的结果,如何将结果放在变量之上? 我在子进程中使用stdout,stderr,但不起作用。 我正在使用python 2.7
Python subprocess and user interaction
link上方通常讨论如何在变量中获取输出,但是我的问题与rfcomm有关,该问题没有将其结果放入变量中,我运行了这些脚本,它们运行良好,但确实可以与rfcomm命令一起使用时不起作用
答案 0 :(得分:3)
如果您使用的是 Python 3.5或更高版本,
您可以改用run
。这样,您将可以直接访问
result = subprocess.run(["sudo rfcomm connect /dev/rfcomm0 XX:XX:XX:XX:XX:XX 1"], stdout=subprocess.PIPE)
然后访问您想要的内容,
result.stdout
如果您按照我链接的文档的建议使用了 Python 2.7 ,他们会将您重定向到Older high-level API部分。
从那里您会注意到您可以使用check_output
result = subprocess.check_output(["sudo rfcomm connect /dev/rfcomm0 XX:XX:XX:XX:XX:XX 1"])
请注意,如果您想捕获错误,请同时使用stderr=subprocess.STDOUT
标志。
result = subprocess.check_output("sudo rfcomm connect /dev/rfcomm0 XX:XX:XX:XX:XX:XX 1", stderr=subprocess.STDOUT, shell=True)
过时,有一个重要的事情你不应该知道,
默认情况下,此函数将以编码字节的形式返回数据。输出数据的实际编码可能取决于调用的命令,因此通常需要在应用程序级别处理对文本的解码。
编辑
由于您的目标似乎在跑步时会获得输出。看看这个answer。我更喜欢链接而不是重新发明轮子。
答案 1 :(得分:1)
在返回数据之前,您可能需要发出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)