2016-07-25 9 views
0

私は、uart行を取得してこの文字列をシェルスクリプトに渡そうとします。 シリアル入力行を取得してシェルスクリプトに移動します

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

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

だから、「状態」になりましたシェルスクリプトに与えられなければならない、などの : myscript.sh "This is the serial input..." が、私はこれをどのように行うことができますか?

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

は機能しません。

+0

'os.system()'は 'print'したいものを返しません。サブプロセスが標準出力に何かを出力した場合、それはどこに行かれ、Pythonスクリプトはそれを知ることができません。サブプロセスが何を出力するかを把握するには、 'check_output'メソッド(Python 2.7+) – tripleee

答えて

0

単純な文字列の連結がos.system関数に渡されました。

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

2つの文字列(つまり"./myscript.sh"ser.readLine())を組み合わせる方法はいくつかあり、os.systemを使用して完全なコマンドを実行できます。例えば。文字列はstring.formatメソッドの引数になります私はあなたがprint文で達成したいのかわからない

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

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

また、あなただけの2つの文字列を追加することができます。あなたのコードの呼び出しと入出力を扱う良い方法は、osからsubprocess moduleに切り替えることです。

+0

を' subprocess'モジュールで調べるもう1つの理由があります。 – 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

ありがとう、 - はい、1日に数行しかないので、私は入力行ごとに新しいスクリプトを開始したいと思います。 5年前、私は2つのスクリプトを作成することにしました.1つは読み込み用で、もう1つは行をテストするためです。しかし、読み込み用のシェルスクリプトは新しいhw(pi 3)では機能しませんでしたので、私は新しい "読み込み"スクリプトを探しています。 – dokle

+0

私はパイプラインをできるだけ早く試してみたい、ありがとう。 – dokle

関連する問題