Seite 1 von 1

ValueError: I/O operation on closed file

Verfasst: Sonntag 13. Dezember 2009, 22:32
von newc0mer
Hallo!

Ich möchte ein command (auf linux) absetzen und dannach mit dem output (result) arbeiten:

Code: Alles auswählen

result = subprocess.Popen(cmd, shell=True, bufsize=0, executable=None, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Ich bekomme im output genau das, was ich möchte (mit print result.communicate() kann ich es ausgeben).

Nun würde ich gerne schauen, ob im 2ten feld etwas drin steht und falls ja, entsprechend damit weiter arbeiten:

Code: Alles auswählen

result.communicate()[1].strip()
Dies gibt dann aber ein:

Code: Alles auswählen

    if '' != result.communicate()[1].strip():
  File "/usr/lib64/python2.6/subprocess.py", line 663, in communicate
    return self._communicate(input)
  File "/usr/lib64/python2.6/subprocess.py", line 1152, in _communicate
    rlist, wlist, xlist = select.select(read_set, write_set, [])
ValueError: I/O operation on closed file
Meine Frage ist nun, wieso und wie kann ich das anderst machen? ich hab schon versucht, eine kopie von result zu machen und damit weiter zu arbeiten. ich möchte das file (ich nehmen an das pipe-file) ja nicht ändern oder so, nur lesen, ob was drin steht...

kann mir da echt jemand weiterhelfen?

danke im voraus!

Verfasst: Sonntag 13. Dezember 2009, 22:50
von BlackJack
@newc0mer: Du kannst `communicate()` nur einmal aufrufen. Vielleicht verwirrt Dich der Name `result` ja, denn das ist kein Ergebnis von dem Unterprozess, sondern ein Objekt, dass den Prozess selbst repräsentiert. Und der läuft eben nur einmal und wenn er gelaufen und beendet ist, kann man nicht mehr mit ihm kommunizieren. Der Prozess existiert auf Betriebssystemebene dann ja schon nicht mehr.

Das Ergebnis was Dir vorschwebt dürfte eher der Rückgabewert der `communicate()`-Methode sein.

*Kopiert* hast Du `result` übrigens ganz bestimmt nicht, das geht nämlich gar nicht. Wahrscheinlich hast Du das Objekt bloss an einen anderen Namen gebunden.

Verfasst: Montag 14. Dezember 2009, 17:26
von newc0mer
diese info hat weitergeholfen - thx!

ich kopiere nun von result.communicate() den inhalt in eine andere variable.

mit dieser kann ich dann auch weiterhin arbeiten :-)

Verfasst: Montag 14. Dezember 2009, 17:32
von cofi
newc0mer hat geschrieben:ich kopiere nun von result.communicate() den inhalt in eine andere variable.
Nochmal: Es gibt keine Variablen, in die man etwas kopieren koennte. Du bindest das Objekt nur an einen Namen, nicht dass du dich wunderst, warum das keine eigenstaendigen Objekte sind.

Verfasst: Montag 14. Dezember 2009, 18:06
von Dav1d
cofi hat geschrieben:Nochmal: Es gibt keine Variablen, in die man etwas kopieren koennte.
sondern nur Bezeichner ;)