我有一個安裝了 python 2.7 的 raspberry pi 4 (RPI)。在 python 腳本中,我正在執行一個 shell 腳本,它會閃爍一個連接到 pi 的 μController (μC)。shell 腳本會列印一些內容并在列印“Connecting”后達到空閑狀態。請注意,腳本此時尚未完成!
現在我想使用子行程(或任何其他函式)將 shell 腳本中的所有列印件轉發給我。然后我想檢查是否列印了關鍵短語“Connecting”。此外,如果 shell 腳本在列印“連接”之前卡住,我需要超時。但是,我對 python 很陌生,因此我不知道如何正確使用子行程才能從 shell 腳本中檢索列印并為腳本設定超時。
這是某種偽代碼:
output = subprocess.Popen(["./prebuilt/bin/bbb_cc13xx-sbl /dev/ttyACM0 {hexfileName} cc13x2 -e -p -v"], \
stdout=subprocess.PIPE, stderr = subprocess.PIPE, shell = True)
expression_found = False
for i in range(5)
if(output.stdout.find('Expression') != -1):
expression_found = True
break
time.sleep(1)
if(expression_found):
do that..
else:
do this...
有沒有一種簡單的方法來實作我的兩個需求?
編輯:像 os.system() 那樣將列印添加到終端也會很棒。
最好的祝福 Slev1n
uj5u.com熱心網友回復:
我實際上找到了一個簡單的解決方案,錯誤是通過管道 stderr 而不是 stdout。第一個一直/大部分時間都是空的。
這是一個解決方案,其中來自子行程的列印實時顯示在終端上,并且我能夠在 stdout 管道中搜索關鍵字。我還能夠毫無錯誤地終止子行程。我還可以添加超時以終止子行程。這些代碼也在樹莓派 4B 上使用 python 2.7 進行了驗證。
這里的主要程序:
import subprocess, sys
import time
cmd = "contprint.py"
p = subprocess.Popen( cmd , shell=True,
stdout=subprocess.PIPE,
universal_newlines=True)
startTime = time.time()
maxTime = 8
while True:
currentTime = time.time()
if (currentTime - startTime) > maxTime:
p.terminate()
break
else:
output = p.stdout.readline()
print(output)
keyWord = "EOF"
if keyWord in output:
print("Keyword {} has be found".format(keyWord))
p.terminate()
break
if len(output) == 0:
print("Output is empty")
p.terminate()
break
if p.poll() is not None:
print("p.poll is not none")
p.terminate()
break
這里是子行程:
import time, sys
count = 0
while(1):
count = 1
print(count)
try:
sys.stdout.flush()
except:
print("Escape Error!")
time.sleep(0.5)
if(count == 10):
print("EOF")
if(count == 20):
pass`enter code here`
歡迎提出任何意見。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/359235.html
標籤:python-2.7 树莓派4
上一篇:從Python2.7腳本啟動XAMPP控制面板ApacheMySql
下一篇:無法解碼串口資料
