2016-07-25 3 views
0

Ich versuche, eine UART-Zeile zu greifen und gebe diese Zeichenfolge an ein Shell-Skript;greifen Sie auf die serielle Eingabezeile und verschieben Sie sie in ein Shell-Skript

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

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

Also, „Staat“ soll nun auf einen Shell-Skript gegeben, wie: myscript.sh "This is the serial input..." aber wie kann ich das tun?

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

funktioniert nicht.

+0

'os.system()' gibt nichts zurück, was Sie drucken möchten. Wenn der Subprozess irgendetwas auf die Standardausgabe ausgibt, wird es dort hingehen und Ihr Python-Skript wird es nicht wissen. Wenn Sie erfassen möchten, was der Unterprozess druckt, haben Sie noch einen weiteren Grund, das Modul 'subprocess' zu betrachten, speziell die 'check_output'-Methode (Python 2.7+) – tripleee

Antwort

0

Nur einfache String-Verkettung an die os.system-Funktion übergeben.

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

Es gibt verschiedene Möglichkeiten, zwei Strings zu kombinieren (nämlich "./myscript.sh" und ser.readLine()), die Ihnen dann den vollständigen Befehl geben, der unter Verwendung von os.system ausgeführt werden kann. Z.B. Strings können Argumente der string.format Methode:

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

Sie können auch nur zwei Strings hinzufügen:

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

Ich bin nicht sicher, was Sie mit dem print Aussage erreichen wollen. Eine bessere Möglichkeit, den Aufruf und die Eingabe/Ausgabe Ihres Codes zu handhaben, wäre es, von os auf subprocess module umzuschalten.

+0

Der print commend diente nur zum Testen der seriellen Lesung. – dokle

+0

@dokle Gut zu wissen. Ich hoffe, ich konnte helfen ... – jotasi

+0

arbeitete für mich, danke – dokle

0

Wenn myscript kontinuierlich zusätzliche Eingabe lesen können, haben Sie eine viel effizientere Pipeline.

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

Wenn Sie einen neuen myscript.sh für jede Eingabezeile starten müssen, (Sie wirklich wollen Ihr Design zu überdenken, aber) Sie können natürlich:

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

Beachten Sie, wie in den beiden Fälle wir avoid a pesky shell.

+0

Danke, - ja, ich würde ein neues Skript für jede Eingabezeile beginnen, weil es nur wenige Zeilen pro Tag gibt und ich die Fähigkeit brauche, das Prozessskript zu ändern , ohne den Lesevorgang zu unterbrechen, also entschloss ich mich vor fünf Jahren, zwei Skripte zu erstellen, einen zum Lesen und einen zum Testen der Zeilen. Aber das Shell-Skript zum Lesen funktioniert nicht im neuen hw (pi 3), also suche ich jetzt ein neues "reading" -Skript. – dokle

+0

Ich möchte die Pipeline so schnell wie möglich versuchen, danke. – dokle

Verwandte Themen