2016-07-25 21 views
0

我試圖抓住uart-line並將此字符串賦予shell腳本;抓住串行輸入行並將它們移動到shell腳本

#!/usr/bin/env python 
import os 
import serial 

ser = serial.Serial('/dev/ttyAMA0', 4800) 
while True : 
try: 
    state=ser.readline() 
    print(state) 
except: 
    pass 

所以,「狀態」應該給一個shell腳本現在, 像:myscript.sh "This is the serial input..." 但我怎麼能做到這一點?

print(os.system('myscript.sh ').ser.readline()) 

不起作用。

+0

'os.system()'不會返回任何你想'打印'的東西。如果子進程向標準輸出輸出任何東西,那就是它將要去的地方,並且你的Python腳本不會知道。如果你想捕獲子進程打印的內容,你有另一個理由來看看'subprocess'模塊,特別是'check_output'方法(Python 2.7+) – tripleee

回答

0

只是簡單的字符串連接傳遞給os.system函數。

import os 
os.system("myscript.sh " + ser.readline()) 
0

有兩種不同的方式來組合兩個字符串(即"./myscript.sh"ser.readLine()),然後它會給你完整的命令,使用os.system運行。例如。字符串可以是string.format方法的參數:

os.system('myscript.sh {}'.format(ser.readline())) 

您也可以只添加兩個字符串:

os.system('myscript.sh '+ser.readline()) 

我不知道你想達到與print聲明什麼。處理代碼的調用和輸入/輸出的更好方法是從os切換到subprocess module

+0

,打印命令僅用於測試串行讀取。 – dokle

+0

@dokle很高興知道。我希望我可以幫忙... – jotasi

+0

爲我工作,謝謝 – dokle

0

如果myscript可以連續讀取額外的輸入,您將擁有更高效的管道。

from subprocess import Popen, PIPE 
sink = Popen(['myscript.sh'], stdin=PIPE, stdout=PIPE) 
while True: 
    sink.communicate(ser.readline()) 

如果你要開始一個新的myscript.sh每個輸入線,(你真的要重新考慮你的設計,不過)就可以了,當然:

while True: 
    subprocess.check_call(['myscript.sh', ser.readline()) 

請注意,在這兩個我們的案例avoid a pesky shell

+0

謝謝, - 是的,我會爲每個輸入行開始一個新腳本,因爲每天只有幾行代碼,我需要能夠更改進程腳本在不中斷閱讀過程的情況下,從5年前開始,我決定編寫兩個腳本,一個用於閱讀,另一個用於測試線條。但是用於閱讀的shell腳本在新的hw(pi 3)上不起作用,所以現在我正在搜索新的「閱讀」腳本。 – dokle

+0

我想嘗試管道盡快,謝謝。 – dokle

相關問題