broken pipe error

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
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Hallo
ich bekomme von Zeit zu Zeit einen broken pipe error. Der sieht genaugenommen so aus:

Code: Alles auswählen

<type 'exceptions.IOError'>: [Errno 32] Broken pipe
Seit einiger Zeit habe ich ja den subprocess mit communicate drin (ich habe vor einigen Wochen danach hier gefragt)
http://www.python-forum.de/viewtopic.php?f=1&t=23429 Konsolenausgabe von externen Programm verwenden


und seitdem komme das dann und wann. ein gwöhnliches printf verweigert dann die Ausgabe.

Verwendet wird das u.a. so:

Code: Alles auswählen

stdout, stderr = Popen(["locate", self.cbPattern.GetValue()], stdout=PIPE, stderr=PIPE).communicate()
self.listctrl.SetItems(stdout.split('\n'))
oder

Code: Alles auswählen

stdout, stderr = Popen(["gksudo", "updatedb"], stdout=PIPE, stderr=PIPE).communicate()
Warum kommt das öfters? Wie kann ich den Fehler beheben?

muss ich die Pipe wieder irgendwie "restoren"?

Würde der von mir vorgeschlagene (jedoch kritisierte Code) den Fehler umgehen?

Code: Alles auswählen

stdout_handle = os.popen("ls -l", "r")
consoleout = stdout_handle.read()
BlackJack

@Francesco: Dieser Fehler tritt auf, wenn man versucht auf eine Pipe zu schreiben oder von ihr zu lesen, die von der Gegenseite bereits geschlossen wurde.

Ob das jetzt ein Problem ist, oder ignoriert werden kann, müsste man im Einzelfall abklären.

Was meinst Du mit `printf`? Das ist eine andere Programmiersprache! ;-)

An der Pipe selber kannst Du nichts "restoren". Wenn die Gegenseite eine Pipe geschlossen hat, erwartet sie danach natürlich auch nichts mehr über diesen Kanal bzw. wird auch selbst darüber nichts mehr schicken wollen.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

@BlackJack: Hm, Tatsache ist, dass ich bei nächsen print (ah printf :) ) dann den Error bekomme, dass ich nichts mehr schreiben kann.

Noch einen link habe ich gefunden. Verstehe ich zwar nicht ganz (anscheinend, wenn er auf stderr was hinausschreibt (weils vielleicht ein fehler ist), dann kommt die errormessage.

http://stackoverflow.com/questions/2067 ... with-stdin

Ich habe jetzt einmal stderr gar nicht angegeben. Vielleicht hilfts ja. :)
BlackJack

@Francesco: Das hilft nicht die 'broken pipe' zu beheben, sondern man sieht in der Konsole ob das Programm vielleicht eine Fehlermeldung ausgibt, die verrät warum das passiert ist. Wie im Beispiel.

Das mit dem `print` habe ich trotzdem nicht verstanden. So ein normales ``print`` hat doch eigentlich nichts mit Prozessen zu tun, die man mit `subprocess` gestartet hat.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

BlackJack hat geschrieben:@Francesco: Das hilft nicht die 'broken pipe' zu beheben, sondern man sieht in der Konsole ob das Programm vielleicht eine Fehlermeldung ausgibt, die verrät warum das passiert ist. Wie im Beispiel.

Das mit dem `print` habe ich trotzdem nicht verstanden. So ein normales ``print`` hat doch eigentlich nichts mit Prozessen zu tun, die man mit `subprocess` gestartet hat.
@BlackJack: ich meinte, ist die Pipe einmal gebrochen, dann weigert sich ein print im programm, auf die konsole zu schreiben. Deswegen habe ich den broken pipe überhaupt erst bemerkt, weil ein print im Gui Programm ein broken pipe reklamiert hat.
BlackJack

@Francesco: Das klingt aber sehr komisch denn die Konsole hat ja nichts mit den Pipes zu tun die `Popen` verwendet!?
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

BlackJack hat geschrieben:@Francesco: Das klingt aber sehr komisch denn die Konsole hat ja nichts mit den Pipes zu tun die `Popen` verwendet!?
Ja eigenartig, jetzt kommt das eh nicht mehr daher. Wie ich das nochmals reproduzieren kann, weiss ich auch nicht. Wenns wieder einmal auftaucht, dann melde ich mich wieder, ;) Übrigens, das wäre schon einge gute Anwendung für den "Zyklus-Screenshoter":

(http://www.python-forum.de/viewtopic.php?f=5&t=23753 OT => "spezielle Screencastfunktion")
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Francesco hat geschrieben:
BlackJack hat geschrieben:@Francesco: Das klingt aber sehr komisch denn die Konsole hat ja nichts mit den Pipes zu tun die `Popen` verwendet!?
Ja eigenartig, jetzt kommt das eh nicht mehr daher. Wie ich das nochmals reproduzieren kann, weiss ich auch nicht. Wenns wieder einmal auftaucht, dann melde ich mich wieder, ;) Übrigens, das wäre schon einge gute Anwendung für den "Zyklus-Screenshoter":

(http://www.python-forum.de/viewtopic.php?f=5&t=23753 OT => "spezielle Screencastfunktion")
Antworten