![](/img/trans.png)
[英]How to store the result of an executed shell command in a variable in 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
上面鏈接談到一般在變量中獲取輸出,但是我的問題中的問題與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.