我正在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"
在shell中,它返回:
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一起使用时不起作用命令
解决方法:
如果您使用的是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)
最后,有一个重要的事情你不应该知道,
By default, this function will return the data as encoded bytes. The actual encoding of the output data may depend on the command being invoked, so the decoding to text will often need to be handled at the application level.
编辑
由于您的目标似乎在运行时获得输出.看一下这个answer.我更喜欢链接而不是重新发明*.