ValueError: I/O operation on closed file

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
newc0mer
User
Beiträge: 15
Registriert: Sonntag 20. Juli 2008, 14:21

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!
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.
newc0mer
User
Beiträge: 15
Registriert: Sonntag 20. Juli 2008, 14:21

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 :-)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

cofi hat geschrieben:Nochmal: Es gibt keine Variablen, in die man etwas kopieren koennte.
sondern nur Bezeichner ;)
the more they change the more they stay the same
Antworten