Seite 1 von 1

Subprocess Output On-The-Fly

Verfasst: Mittwoch 2. August 2006, 10:09
von oozoo
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.

Verfasst: Mittwoch 2. August 2006, 12:54
von 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

Verfasst: Mittwoch 2. August 2006, 15:07
von oozoo
Das tut's, danke ;)

Verfasst: Donnerstag 7. September 2006, 21:09
von Hannes-Spz
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

Verfasst: Donnerstag 7. September 2006, 22:57
von BlackJack
Die Fehlermeldung kann ich nicht nachvollziehen. Wie startest Du das Programm denn?

Verfasst: Freitag 8. September 2006, 07:17
von gerold
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
:-)

Nur ein Verusch!

Verfasst: Freitag 8. September 2006, 19:56
von Maus
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