Alle Unix-Shells (die ich kenne) implementieren Shell-Pipelines über etwas anderes als eine Pty (normalerweise verwenden sie Unix-Pipes! -); Daher wird die C/C++ - Laufzeitbibliothek in cpp_program
WISSEN, dass ihre Ausgabe kein Terminal ist, und daher Puffert sie die Ausgabe (in Blöcken von einigen KB zu einem Zeitpunkt). Es sei denn, Sie schreiben Ihre eigene Shell (oder semiquasimaybeshelloid), die Pipelines über pyt's implementiert, ich glaube, es gibt keine Möglichkeit, das zu tun, was Sie benötigen, indem Sie die Pipeline-Notation verwenden.
Die fragliche "Shelloid" -Ding könnte in Python (oder in C oder Tcl oder ...) geschrieben werden, mit dem pty
Modul der Standardbibliothek oder höhere Abstraktion basierend darauf wie pexpect, und die Tatsache, dass die beiden Programme, die über eine "Pty-basierte Pipeline" verbunden werden sollen, in C++ und Python geschrieben sind, ist ziemlich irrelevant. Die Schlüsselidee ist, das Programm links von der Pipe zu glauben, dass es ein Terminal ist (deshalb muss ein pty an der Wurzel des Tricks sein), um seine Laufzeitbibliothek in die NICHT-Pufferausgabe zu täuschen. Sobald Sie solch ein Shelloid geschrieben haben, würden Sie es mit irgendeiner Syntax wie nennen:
$ shelloid 'cpp_program | python_program.py‘
Natürlich wäre es einfacher sein, eine‚Punkt-Lösung‘zu schaffen, durch python_program
in dem Wissen, das Schreiben, dass es cpp_program
als Unter Prozess erzeugen muß und Trick es in seine stdout zu glauben, einen Terminal (dh python_program
würde dann direkt zB pexpect
verwenden). Aber wenn Sie eine Million solcher Situationen haben, in denen Sie die normale Pufferung durch die vom System bereitgestellte C-Laufzeitbibliothek oder viele Fälle, in denen Sie vorhandene Filter usw. wiederverwenden möchten, vereiteln möchten, ist das Schreiben von shelloid
möglicherweise tatsächlich vorzuziehen.
Wie viel Leistung sprechen Sie? Da sind Puffer beteiligt, also wird alles unter 4K immer eine einzige Sache sein. –
gibt es keine Möglichkeit zu entscheiden * wann * der Puffer geleert werden soll? –