subprocess Popen communicate

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Benutzeravatar
lightos
User
Beiträge: 39
Registriert: Montag 12. Dezember 2011, 19:39
Wohnort: Raum Bruchsal
Kontaktdaten:

Hallo,

ich habe hier folgendes Problem:

Mein Windows-C-Programm (Consolen-exe) läuft in der main-loop und wartet auf _kbhit().
Die exe looped also aktiv mit einem kleinen sleep().

Wie kann man diese exe mit Popen starten und den Key senden, damit die exe stoppt?

Beim Testen mit _getch() und gets() im C-Programm habe ich festgestellt, dass ich mit p.communicate() zwar den Input von gets()
bekomme, nicht aber _getch().
Damit klappt es wohl bei _kbhit() auch nicht.

Geht das überhaupt?

Danke,
lightos
BlackJack

@lightos: Du müsstest wahrscheinlich einen Tastenanschlag für das Terminal simulieren in dem die EXE läuft. Da gibt es Bibliotheken für Python (`SendKeys` oder `PyWinAuto` beispielsweise). Besonders schön ist so eine API ja nicht wirklich.
Benutzeravatar
lightos
User
Beiträge: 39
Registriert: Montag 12. Dezember 2011, 19:39
Wohnort: Raum Bruchsal
Kontaktdaten:

Das habe ich schon gesehen. Benötigt aber unter Python spezielle Erweiterungen, also nicht im Basis-Umfang enthalten.

Das C-Programm kann ich anpassen, aber wie?

Alternativ dann wohl doch lieber über eine C-Dll und ctypes....
BlackJack

@lightos: Das kommt drauf an was das C-Programm macht/machen soll. Man könnte statt eines Tastendrucks eine Eingabezeile lesen und zwar nicht-blockierend. Oder man macht es über ein Signal wie SIGINT oder gar SIGTERM.
Benutzeravatar
lightos
User
Beiträge: 39
Registriert: Montag 12. Dezember 2011, 19:39
Wohnort: Raum Bruchsal
Kontaktdaten:

Hallo BlackJack,

das wäre eine Möglichtkeit.

Aber wie kann man Cross-tauglich (Windows/Linux) nicht-blockiernd von stdin lesen?
BlackJack

@lightos: Man könnte das über einen Thread lösen der das lesen (blockierend) übernimmt und die Daten in eine `Queue.Queue` steckt, die man dann im Hauptthread nicht-blockierend abfragen kann.
Benutzeravatar
lightos
User
Beiträge: 39
Registriert: Montag 12. Dezember 2011, 19:39
Wohnort: Raum Bruchsal
Kontaktdaten:

Ja danke. Das ist der Standard-Fall.
Ist dann aber doch wieder etwas mehr Arbeit (Windows -Thread, pthread, ....)

Dachte schon, es gibt noch was einfacheres.
BlackJack

@lightos: Jetzt hätte ich fast gesagt das wird doch vom `threading`-Modul erschlagen, aber Du hast da auf der Seite der Pipe ja ein C-Programm. :-)
Antworten