如何将rfcomm shell命令的结果放入python中的变量中?

时间:2018-07-13 12:32:05

标签: 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 '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命令一起使用时不起作用

2 个答案:

答案 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)