Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将rfcomm shell命令的结果放入python中的变量中?_Python_Variables_Subprocess_Rfcomm - Fatal编程技术网

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

如何将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

我在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


上面提到的是在变量中获取输出,但我问题中的问题与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.7
run
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()
?我去掉了那一行,但没有发生。和以前一样