@sparrow,BlackJack,lunar: Vielen Dank für eure Tipps.
sparrow hat geschrieben:Ohne jetzt das Ganze in Python zu lösen:
stell dem Aufruf in der Batch-Datei mal ein start vorweg, das müsste das Konsolenfenster verhindern, wenn ich mich richtig erinnere.
M.E. ist es auch kein Python-Problem, sondern eher zwei Windows-Probleme.
1. Ein Prozess mit stdout Umleitung via > lässt sich nicht ohne Konsolenfenster erzeugen.
2. Wird stdout nicht ausgelesen, kommt es zum Bufferüberlauf.
Deine Idee reduziert zumindest das 1. Problem etwas: M.W. wird die Batch dann in einem neuen Prozess gestartet und der alte Prozess und somit das Konsolenfenster nach einem kurzen Augenblick beendet/geschlossen.
Es sollte doch aber eigentlich auch möglich sein, diesen Prozess ohne die 'Hilfskonsole' zu starten.
In Linux/Gnome2 zeigt ein Starter mit sh -c "echo hallo >> ~/hallo.txt" kein Terminal-Fenster. Unter Windows zeigt sich beim Anklicken einer Verknüpfung mit Ziel cmd /c "echo hallo >> c:\hallo.txt" immer kurz ein Fenster.
BlackJack hat geschrieben:@cmax: Warum darf die Anwendung denn nicht verändert werden? `sys.stdout` und `sys.stderr` durch ein Dateiobjekt zu ersetzen ist ja ziemlich einfach zu machen.
Ich kann sie natürlich ändern. Nur sollte es nicht auf jedem Host notwendig sein. Ich schreibe die Skripte nur, sie werden dann vom Admin 'installiert' (Konfguration) und von anderen genutzt.
Mir gefällt die Funktionsweise der Linuxprogramme ganz gut, es dem Nutzer ohne Änderung des Programms/Skripts zu ermöglichen, Ausgaben umzuleiten oder weiter zu nutzen (bspw. sed, grep).
Das Ersetzen von sys.stdout & Co wird sich wahrscheinlich sowieso nicht vermeiden lassen, da ich unter Windows das o.g. 2. Problem verhindern muss. Also muss m.E. mindestens ein Wrapper mit try-Block her.
Im aktuellen Fall, lese ich ohnehin eine Konfig-Datei (SafeConfigParser) aus. Also läufts wohl auf Folgendes hinaus: Dateinamen für stdout/err aus Config. Bufferüberlauf in einem Try-Block abfangen.
Aber für kleinere Skripte würde ich es gern (ohne zusätzlichen Aufwand für Konfig und Skript-Optionen/-Parameter) dem Admin/Anwender ermöglichen, den Output entsprechend umzuleiten.
lunar hat geschrieben:@cmax Ändere die Anwendung, und nutze "logging", statt direkt auf "sys.stdout" zu schreiben. Diese Lösung ist zwar aufwendiger als eine Batch-Datei, bietet Dir aber mehr Flexibilität und Kontrolle über die Ausgaben der Anwendung.
Ich hab mir das Modul mal angeschaut und bin von den Möglichkeiten recht angetan. Aber m.E. löst das Modul o.g. Probleme nicht, oder?