簡體   English   中英

如何將rfcomm shell命令的結果放入python中的變量?

[英]How can I put result from rfcomm shell command in to a variable in python?

我在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子流程和用戶交互

上面鏈接談到一般在變量中獲取輸出,但是我的問題中的問題與rfcomm相關,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 ,正如我鏈接的文檔所建議的那樣,他們會將您重定向到較舊的高級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)

最后,有一個重要的不是你應該知道的,

默認情況下,此函數將數據作為編碼字節返回。 輸出數據的實際編碼可能取決於被調用的命令,因此通常需要在應用程序級別處理對文本的解碼。

編輯

因為你的目標似乎是在跑步時獲得輸出。 看看這個答案 我更喜歡連接而不是重新發明輪子。

您可能需要在返回數據之前發出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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM