Raspberry Pi Python kommunikation zwischen drei programmen?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Raspberry Pi Python kommunikation zwischen drei programmen?

Da gibt es ganz, ganz viele Möglichkeiten :).

Jedes Programm hat eine "Umgebung", in der es ausgeführt wird. Aus Sicherheitsgründen kann ein Programm NUR in seine Umgebung schreiben und lesen. Du kannst also nicht so einfach eine Variable in einem anderen Programm setzen.

Grundsätzlich gibt es unterschiedliche Möglichkeiten, wie Programme miteinander kommunizieren können. Diese wäre unter anderem (Named) Pipes, Ports, Dbus, gemeinsamer Speicher, Aufruf-Argumente, ...

Die Alternative hierzu ist natürlich eben keine 3 Programme zu schreiben. Sondern eines. Es gibt auch hier z.B. zudem Möglichkeiten in einem Programm unterschiedliche Ausführungsstränge (genannt Tasks) "gleichzeitig" auszuführen.

Das hat den Vorteil, dass man eben auch gemeinsame Variablen nutzen kann - jedoch muss man dann von Hand synchronisieren, dass alles geordnet abläuft (und das ist nicht ganz ohne).

Zu deinem konkreten Problem:

Kommt ein bisschen darauf an.

Wenn die Ereignisse hinreichend selten sind, kannst du, wenn ein Sensor ausgelöst wird, jedes mal eben ein Programm aufrufen:

https://docs.python.org/2/library/subprocess.html#using-the-subprocess-module

Wenn die Programme hinreichende Komplexität haben, könnte ich mir auch eine Pipe-Implementierung vorstellen.

Hierbei kannst du entweder Named Pipes (mkfifo) nehmen - oder eben beim Aufrufen in der Bash das Zeugs: |

Oder eben das Problem damit umgehen, dass du nur ein Programm machst.

Meine Programme sollten die ganze Zeit laufen, das 1. soll etwa 10 mal pro Sekunde die Daten an das 2. schicken und dieses so schnell es geht an das 3. Ich werde mich mal schlaumachen über "Pipes"... 

Mein konkretes Problem: Ich muss möglichst genau messen wie lange die Sensoren mir ein Signal geben, diese Signal-längen verrechnen und entscheiden was ich einer Servo schicke, diese will alle 20ms einen Puls der von der Berechnung abhängig ist... Um alle Signale der Sensoren zu erhalten brauche ich mehr als 20ms also kann ich das nicht "zwischen" den Puls an die Servo schieben.


hoffe es ist verständlich - danke 

PS:

Es müsste theoretisch auch funktionieren meine WErte einfach in eine Datei zu schreiben und diese dann von einem anderen Programm einzulesen? Dauert das womöglich zulange?

0
@IBAxhascox

Zur Vollständigkeit:

https://docs.python.org/2/library/threading.html

So kann man in einem Programm quasi 3 Programme laufen lassen, so dass trotzdem jedes Programm alles sehen kann, was jedes andere Programm macht.

Die Sychronisation hierbei ist jedoch alles andere als trivial - weshalb ich die Pipe-Variante fast für einfacher erhalte.

Pipes

Weiß nicht, wie viel du schon bash gemacht hast.

Hast eventuell schon mal etwas wie:

ps aux | sort -nr 

gesehen. ps aux zeigt dir alle Prozesse an. Das ganze wird einfach ausgegeben.

Mit | gibst du die Ausgabe von ps aux aber nicht aus, sondern leitest sie an sort -nr weiter. sort -nr bekommt die Ausgabe von ps aux als Eingabe.

Das kannst du auch machen.

python read_sensors.py | python verarbeite.py | python steuerung.py

Bei read_sensors.py musst du nun einfach mit print("whatever") alles ausgeben, was du weitergeleitet haben willst.

In verarbeite.py kannst du mit raw_input die Eingabe lesen - und gibst die verarbeiteten Daten wieder mit print aus.

In steuerung.py schließlich noch ein mal raw_input zum lesen.

Named Pipes

Named Pipes funktionieren genauso - nur dass du deiner Pipe eben einen Namen gibst und das Gebilde so anders aufrufen kannst.

Mit mkfifo pipe auf der Kommandozeile erzeugst du eine neue pipe. Diese wird dir als ganz normale Datei angezeigt und verhällt sich auch wie eine Datei.

Mit ganz normalen FileReader/FileWriter kannst du diese somit lesen und schreiben. Und alles, was du irgendwo bei einem FileWriter einschreibst, kommt beim FileWriter heraus.

Python hat hierfür sogar ein spezielles Modul

https://docs.python.org/2/library/pipes.html

Gruß

Tuxgamer

2
@IBAxhascox

Es müsste theoretisch auch funktionieren meine WErte einfach in eine
Datei zu schreiben und diese dann von einem anderen Programm einzulesen?
Dauert das womöglich zulange?

Named Pipes kannst du wie Dateien benutzen.

Jedoch haben Pipes einige Vorteile gegenüber Dateien. Performance ist das eine. Viel wichtiger ist jedoch, dass Pipes die ganze Synchronisations-Arbeit abnehmen.

Glaub mir: Mit Pipes ist es einfacher.

0

Wieso willst Du das denn mit 3 Programmen machen? Ein Programm!

Was möchtest Du wissen?