Seite 1 von 1
FIFO in ein Array einlesen
Verfasst: Samstag 16. Juli 2016, 18:42
von phischmi
Hallo zusammen,
ich habe zwei Scripte, welche über eine FIFO-Pipe kommunizieren.
Das erste Script schreibt das beim Aufruf übergebene Argument in die FIFO, das zweite zweite liest die FIFO aus und verarbeitet den Inhalt weiter.
Hier der Code:
Code: Alles auswählen
path = "/tmp/FIFO"
if not os.path.exists(path):
os.mkfifo(path)
fifo = open(path, "w")
fifo.write(argv[1])
fifo.close()
Code: Alles auswählen
PATH = "/tmp/FIFO"
FIFO = open(PATH, "r")
while True:
with open(PATH) as READER:
print(READER.readline())
Soweit funktioniert das prima
Aktuell übergebe ich nur ein Argument. Künftig sollen aber zwei Argumente übergeben werden, die entsprechend auch in die Pipe geschrieben werden - wie auch immer voneinander getrennt (zwei Zeilen, Trennzeichen o.ä.).
Mein Frage ist nun, wie stelle ich es nun am besten an, die zwei Werte in die Pipe zu schicken und im weiterverarbeitenden Script am besten in ein Array zu lesen?
Ich bin absoluter Python-Neuling und weiss zwar was ich vor habe, habe jedoch noch keine Ahnung, wie ich das in Python am geschicktesten umsetze...
Danke und schönen Abend euch!
Philipp
Re: FIFO in ein Array einlesen
Verfasst: Samstag 16. Juli 2016, 21:08
von DasIch
Schau dir mal msgpack an. Damit kannst du Objekte serialisieren und über das FIFO schicken und am anderen Ende wieder lesen. Auf die Weise musst du dich überhaupt nicht darum kümmern wie das Protokoll aussieht.
Re: FIFO in ein Array einlesen
Verfasst: Samstag 16. Juli 2016, 22:16
von phischmi
Hi, danke für den Hinweis.
Das hört sich sehr gut an und würde prinzipiell auf meine Problemstellung passen. Leider kann ich nicht auf externe libs zurück greifen :/
Zu diesem Problem habe ich
hier mehr geschrieben.
Ich bin also leider auf Bordmittel von Python 2 angewiesen

Re: FIFO in ein Array einlesen
Verfasst: Samstag 16. Juli 2016, 22:33
von DasIch
Das ist sehr schlecht und ein Problem dass du versuchen solltest langfristig zu lösen. In der Zwischenzeit könntest du einfach Vendoring betreiben, also den Code der externen Library selbst mit ausliefern statt die Library zu installieren. Wenn auch dass aus irgendwelchen Gründen nicht geht, würde ich die msgpack Spezifikation selbst implementieren. Das ist zwar mMn Zeitverschwendung aber dennoch besser als sowas komplett selbst zu entwerfen.
Re: FIFO in ein Array einlesen
Verfasst: Sonntag 17. Juli 2016, 01:17
von phischmi
Ich weiss leider nicht, wie ich dieses Problem lösen könnte, da mir hierzu das Hintergrundwissen fehlt :/
Siehe hierzu auch den anderen Thread.
Dennoch habe ich es jetzt geschafft
umsgpack.py zu integrieren.
Nur ist mir noch nicht ganz klar, wie ich damit über zwei Scripte hinweg Daten austausche :K
Das funktioniert zumindest schon einmal (in einer Datei):
Code: Alles auswählen
pack = umsgpack.packb(argv[1])
print umsgpack.unpackb(pack)
Re: FIFO in ein Array einlesen
Verfasst: Sonntag 17. Juli 2016, 01:29
von DasIch
Unter den Beispielen gibt es etwas zu "Streaming serialization with file-like objects:", was sich auf deine Situation übertragen lässt.
Re: FIFO in ein Array einlesen
Verfasst: Sonntag 17. Juli 2016, 10:09
von BlackJack
Spricht eigentlich was gegen JSON? Das ist schon in der Standardbibliothek.
Re: FIFO in ein Array einlesen
Verfasst: Sonntag 17. Juli 2016, 10:16
von phischmi
Hi,
danke! Das Beispiel habe ich gestern überlesen. War wohl schon zu spät...
Mein Code sieht nun so aus:
Code: Alles auswählen
Path = "/tmp/my_program.fifo"
if not os.path.exists(path):
os.mkfifo(path)
f = open(path, 'wb')
#umsgpack.pack({u"compact": True, u"schema": 0}, f)
umsgpack.pack([argv[1], argv[2]], f)
f.close()
Die auskommentierte Zeile verstehe ich allerdings nicht :K
So sieht das empfangende Script aus:
Code: Alles auswählen
PATH = "/tmp/my_program.fifo"
if not os.path.exists(PATH):
os.mkfifo(PATH)
while True:
with open(PATH, 'rb') as f:
print (umsgpack.unpack(f))
f.close()
Funktioniert!
Aus
$ ./artisan.py FAN 130
Wird
>>> [b'FAN', b'130']
Die Werte kann ich dann in eine Liste einlesen und einzeln ansprechen. So wie ich es mir vorgestellt habe
Wie bekomme ich nun noch das
b'...' weg, bzw. wo kommt das her?
Danke!!
@blackjack
JSON kann ich zumindest ohne Fehlermeldung importieren, das scheint also in Artisan enthalten zu sein...
Werde ich später auch mal mit testen

Re: FIFO in ein Array einlesen
Verfasst: Sonntag 17. Juli 2016, 10:50
von phischmi
phischmi hat geschrieben:
Die auskommentierte Zeile verstehe ich allerdings nicht :K
Streicht das...

Re: FIFO in ein Array einlesen
Verfasst: Sonntag 17. Juli 2016, 11:26
von phischmi
Habe es grad mit JSON getestet und das funktioniert ebenfalls prima - und eben auch ohne zusätzliche libs

Ich werde dann wohl diesen Weg verfolgen.
Besten Dank für eure Hilfe!