subprocess Ausgaben in "Echtzeit" verabeiten

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Nein, Pexpect kann nur unter Linux ein Pseudo Terminal erstellen. Unter Windows nicht, siehe:
Pexpect does not currently work on the standard Windows Python (see the pty requirement); however, it seems to work fine using Cygwin. It is possible to build something like a pty for Windows, but it would have to use a different technique that I am still investigating. I know it's possible because Libes' Expect was ported to Windows. If you have any ideas or skills to contribute in this area then I would really appreciate some tips on how to approach this problem.
http://www.noah.org/wiki/Pexpect#pty_module

Es gibt ja diese zwei arten an Puffer in der stdio.h: Line-Buffer und "Block-Puffer" und die stdio.h weiß ja ob es in einer Pipe oder in einem echten Terminal schreibt. Man muss es also so drehen, das stdio.h statt der Pipe ein Terminal sieht... Aber wie geht das?

Im Netz finde ich immer nur Leute/Beiträge die das selbe Problem haben, aber nirgends eine Lösung dafür...

Evtl. müßte es mit "PyConsole" funktionieren: http://code.google.com/p/pyconsole/
Das Demo Filmschen sieht nett aus: http://www.plan10.com/PyConsole/demo_wx.htm
pyconsole_wx.py funktioniet bei mit allerdings nicht. Wenn man ein Kommando eingibt, wird es ausgefügt (Kann man im Taskmanager sehen) aber die Ausgabe sieht man nicht in der Konsole :(

EDIT: Vielleicht mal mit externen Tools probieren. Aber z.B. tee.exe aus http://sourceforge.net/projects/unxutils macht zwar im Prinzip was es soll, aber man sieht auch erst am Ende die Ausgaben. Ist ja auch nur eine Pipe Umleitung...

EDIT2: Crosspost:
http://python.net/pipermail/python-de/2 ... 08990.html

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Hi, ich muss diesen Beitrag mal wieder ausgraben weil ich gerade genau an diesem Problem knabbere.

Ich möchte (unter Linux) ein Programm starten und dessen Ausgabe auswerten. Das dürfte mit Pexpect schon einigermaßen funktionieren. Problem ist jetzt, das das CLI Programm eine Art Fortschrittsbalken mit ASCII Zeichen ausgibt was ich auswerten möchte um es in einem grafischen Balken darzustellen.

Kann man mit Pexpect zeichenweise lesen? So wie ich das bisher sehe geht das anscheinend nicht.
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

So, ich habe mir den Sourcecode von pexpect.py angeschaut und bin etwas schlauer geworden. Es gibt zb die Methoden read() und readline().

Ich habe zuerst versucht mit readline() zu arbeiten. Das Problem ist, das readline() nach \r\n sucht. Bei dem Programm, das ich auswerten möchte, habe ich jetzt das Problem das es den Fortschrittsbalken zwar ausgibt, aber dazu nutzt das Programm nur \r, damit die gleiche Zeile immer wieder überschrieben wird. Man hat also die komplette Ausgabe des Fortschrittsbalken in einer Zeile.

Ich habe jetzt mit read() eine Funktion gebastelt

Code: Alles auswählen

import pexpect
c = pexpect.spawn ('/usr/bin/avrdude -pm128 -U flash:r:test.hex:i')
#c = pexpect.spawn ('/usr/bin/avrdude -pm128')

h=""
while True:
    s=c.read(1)
    if not s:
        break
    elif "\r" in s:
        print repr(h)
        h=""
    else:
        if not "\n" in s:
            h=h+s
Der Fortschrittsbalken sieht so aus

Code: Alles auswählen

Reading |                                                    | 0% 0.00s
Reading | #                                                  | 1% 0.44s
Reading | #                                                  | 2% 0.80s
Reading | ##                                                 | 3% 1.17s
Reading | ##                                                 | 4% 1.54s
Reading | ###                                                | 5% 1.90s
Reading | ###                                                | 6% 2.27s
.
.
.
Reading | #################################################  | 97% 36.38s
Reading | #################################################  | 98% 36.74s
Reading | ################################################## | 99% 37.11s
Reading | ################################################## | 100% 37.48s
Ich nehme an, das andere Programme, die einen Fortschritt immer in der gleichen Zeile ausgeben, genauso vorgehen. Man kann mit der Methode expect() hier anscheinend wenig anfangen sondern muss mit read(1) jedes Zeichen einzeln holen und selbst auswerten.

Vielleicht hilft es ja dem einen oder anderen weiter
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Habe gerade http://ipython.scipy.org gefunden. Eine shell in Python. Es gibt das auch für Windows: http://ipython.scipy.org/moin/IpythonOnWindows
Für Windows wird das genutzt: http://sourceforge.net/projects/console

Vielleicht kann man damit was anfangen?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

IPython ist keine Shell sondern ein erweiterter Python-Interpreter und wenn du die Forumssuche nutzt, merkst du auch, dass das hier jeder zweite nutzt. Ist ja auch eine praktische Sache, bunte Prompts, rote Fehlermeldungen, paar magische Features wie die Möglichkeit Shell-Kommandos direkt durchzuführen, Profiler zu starten etc.

Die Python-Shell ist nur ein Nebenprodukt von IPython.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Leonidas hat geschrieben:dass das hier jeder zweite nutzt
Hallo Leonidas!

IPython nutzen sicher viele hier. Aber wahrscheinlich nicht jeder Zweite. :wink: Es gibt ja auch noch andere richtig gute interaktive Pythoninterpreter.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten