Subprocess Output On-The-Fly

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
oozoo
User
Beiträge: 2
Registriert: Mittwoch 2. August 2006, 09:57

Hi,

normalerweise mache ich Java, habe mich jetzt aber entschieden meine kleinen Commandline-Tools in Python zu bauen und habe nen kleines Verständnisproblem mit dem Subprocess-Modul, in meinem Fall will ich grad nen kleines Tool zum Überwachen von Yum schreiben, dafür brauche ich so etwas wie

while(read()): in java wäre das vgl. Inputstreamreader

while((line=br.readLine())!=null)

aber irgendwie will es nicht,

while(out = p.stdin.read()) mag python ja nicht und while(p.wait()) auch nicht :-/

wichtig ist, dass der Output zeilenweise eintrudelt und nicht gebuffert als kompletter Block am Ende.

Wäre toll wenn mir jemand helfen könnte.
BlackJack

Wie wär's damit:

Code: Alles auswählen

from subprocess import Popen, PIPE, STDOUT

process = Popen(('ls', '-lh'), stdout=PIPE, stderr=STDOUT)
for line in process.stdout:
    print line
oozoo
User
Beiträge: 2
Registriert: Mittwoch 2. August 2006, 09:57

Das tut's, danke ;)
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

hi@all
:? ich finds mist - hier klappt GAR nix:

Code: Alles auswählen

import os, popen2, subprocess

process = subprocess.Popen("E:\\_cpp\\tuts\\summe.exe 3 41", shell=True, stdout=subprocess.PIPE)
process.wait()
print process.stdout.read()
wobei die exe: "summe" folgenden code hat:

Code: Alles auswählen

#include <cstdlib>
#include <stdlib.h>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int x, y;
    x = atoi(argv[1]);
    y = atoi(argv[2]);
    cout << x+y;
    return 1;
}
dennoch ergibt es die lustige fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:/Dokumente und Einstellungen/04jostoy/Desktop/popen_.py", line 5, in -toplevel-
    process = subprocess.Popen("E:\\_cpp\\tuts\\summe.exe 3 41", shell=True, stdout=subprocess.PIPE)
  File "C:\Python24\lib\subprocess.py", line 533, in __init__
    (p2cread, p2cwrite,
  File "C:\Python24\lib\subprocess.py", line 593, in _get_handles
    p2cread = self._make_inheritable(p2cread)
  File "C:\Python24\lib\subprocess.py", line 634, in _make_inheritable
    DUPLICATE_SAME_ACCESS)
TypeError: an integer is required
mit der ich aber absolut nichts anfangen kann

bitte helft mir! - ich dreh sonst durch bei dem kram :shock: :shock: :shock:
liebe grüße und danke im voraus
hannes
BlackJack

Die Fehlermeldung kann ich nicht nachvollziehen. Wie startest Du das Programm denn?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hannes-Spz hat geschrieben:

Code: Alles auswählen

TypeError: an integer is required
Hallo Hannes!

Subprocess verhält sich unter Windows ziemlich unberechenbar. Das habe ich öfter schon mitbekommen und ist der Grund, weshalb ich es so selten benutze. Je nach übergebenen Parametern, kommt immer wieder die oben genannte Meldung. Da hätten sich die Entwickler eine aussagekräftigere Fehlermeldung überlegen können...

Versuche doch mal diesen Aufruf:

Code: Alles auswählen

process = subprocess.Popen(("E:\\_cpp\\tuts\\summe.exe", "3", "41"), stdout=subprocess.PIPE)
Vielleicht funktioniert es dann bei dir.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Maus
User
Beiträge: 1
Registriert: Freitag 8. September 2006, 19:48
Kontaktdaten:

Hi Hannes!

Du könntest versuchen, dich bei deinen Freunden zu melden und diesen dein Problem zu schildern... vielleicht können sie dir helfen...

Und wenn nicht, dann möchten sie möglicherweise einfach so mal mit dir reden. Vielleicht sind sie ja schon traurig, weil du dich nicht meldest...

War nur so´n Gedanke *sry*.
Hdl, Maus
Antworten