FIFO in ein Array einlesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
phischmi
User
Beiträge: 34
Registriert: Dienstag 12. Juli 2016, 06:08

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... :roll:


Danke und schönen Abend euch!

Philipp
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
phischmi
User
Beiträge: 34
Registriert: Dienstag 12. Juli 2016, 06:08

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 :(
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
phischmi
User
Beiträge: 34
Registriert: Dienstag 12. Juli 2016, 06:08

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)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Unter den Beispielen gibt es etwas zu "Streaming serialization with file-like objects:", was sich auf deine Situation übertragen lässt.
BlackJack

Spricht eigentlich was gegen JSON? Das ist schon in der Standardbibliothek.
phischmi
User
Beiträge: 34
Registriert: Dienstag 12. Juli 2016, 06:08

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 :)
phischmi
User
Beiträge: 34
Registriert: Dienstag 12. Juli 2016, 06:08

phischmi hat geschrieben: Die auskommentierte Zeile verstehe ich allerdings nicht :K
Streicht das... ;)
phischmi
User
Beiträge: 34
Registriert: Dienstag 12. Juli 2016, 06:08

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!
Antworten