@mcbo: Ob Python eine einfache Programmiersprache ist, da kann man trefflich drüber streiten.

Die Frage bleibt aber, denn wenn ich in Python programmiere und der Hauptteil des Programms aus einem komplizierten Shell-Konstrukt besteht, statt aus Python-Code, dann programmiere ich ja nicht wirklich in Python. Man kann die letztendliche Auswertung der Ausgabe ja in Python schreiben und dass dann in einem Shell-Skript am Ende der Pipes aufrufen. Dann hat man auch Kontrolle darüber mit *welcher* Shell der Shell-Anteil ausgeführt wird. Wie gesagt das ``>(…)`` wird so nicht funktionieren weil die `dash` das nicht kennt.
Das verlinkte Skript scheint mir nicht von jemandem geschrieben worden zu sein der Python kann. Da sind ein paar komische bis unschöne Sachen drin. Und handfeste Fehler.
Wenn man einen ``lambda``-Ausdruck an einen Namen bindet, dann möchte man gar keinen ``lambda``-Ausdruck sondern eine ganz normale Funktionsdefinition. Denn einer anonymen Funktion einen Namen zu geben ist widersinnig.
Bei beiden externen Prozessen ist es unnötig eine Shell zu starten. Das sind bloss zwei *zusätzliche* Prozesse die jeweils zwischen dem Programm und dem jeweiligen externen Prozess sitzen.
Bei beiden externen Prozessen wird die Standardfehlerausgabe ”gepiped” — aber dann wird damit überhaupt nichts gemacht. Sollte auch nur einer der beiden Prozesse dort tatsächlich etwas ausgeben, dann bleibt das alles hängen sobald der Puffer der Pipe voll ist und macht nichts mehr bis man es abbricht. Das ist eindeutig ein Fehler.
Der im Kommentar sogenannte ``try``/``catch``-Hack ist vor allem ein solcher weil *jede* Ausnahme mit einem ``except: pass`` ”behandelt” wird, statt genau die eine Ausnahme dort gezielt zu verarzten die ein Strg+C auslöst. Und *das* wäre dann auch kein ”hack” sondern genau die vorgesehene Methode diese Situation zu verarbeiten.
Das man über die `stdout`-Datei iterieren kann und dass der `poll()`-Aufruf keinen Sinn macht, hatte ich ja schon geschrieben.
`__contains__` ruft man nicht direkt auf. Dafür ist der ``in``-Operator da. Der Test ist allerdings nicht robust weil man ja gar nicht wissen möchte ob irgendwo innerhalb der Zeile 'Alpha:' vorkommt, sondern ob die Zeile mit 'POCSAG512: Alpha: ' *anfängt*. Und diese Zeichenkette sollte man dann auch nicht zum ”aufteilen” benutzen, denn man möchte ja nicht zwei Teile an dieser Zeichenkette trennen, sondern alles *nach* diesem Präfix haben. Das sollte man dann aber auch genau so ausdrücken.
Wenn man das in Python lösen möchte, ohne eine Unix-Shell, dann müsste man die Funktionalität von ``tee`` selber implementieren, also drei Prozesse starten (``rtl_fm``, ``multimon_ng``, und ``play``) und die Standardausgabe von ``rtl_fm`` auslesen und in die Standardeingabe von den beiden anderen Prozessen schreiben. Eventuell mit Hilfe eines zusätzlichen Threads damit da nichts blockiert.