Python - subprocess I/O operation on closed file
Habe ich versucht mit der Klasse unten, Befehle auszuführen, die in der Folge mit subporcess Modul in python2.6.
from subprocess import Popen, PIPE
class BaculaActions():
def __init__(self):
self.console = Popen(["bconsole"], stdout=PIPE, stderr=PIPE, stdin=PIPE)
def run_job(self, jobname, level):
run = self.console.communicate("run job=%s level=%s yes" % (jobname, level))
return(run)
def del_jobid(self, jobid):
delete = self.console.communicate("delete jobid=%s" % (jobid))
return(delete)
Allerdings, wenn ich versuche den folgenden code, bekomme ich die Fehlermeldung:
ValueError: I /O operation on closed file
from pconsole import BaculaActions
myconsole = BaculaActions()
run = myconsole.run_job("xxxxx-data", "incremental")
delete = myconsole.del_jobid(25487)
Jemand Idee was kann falsch sein?
Ich danke
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Handbuch sagt eigentlich auch alles:
Führen Sie nach dem ersten Befehl aus und erhalten das Ergebnis, die 'bconsole" - Prozess hat beendet, die Rohre geschlossen sind und daher der Fehler in der zweiten
communicate
nennen.communicate
- das ist der sicherste Weg, es zu tun, oder wenn 'bconsole' zu lange dauert, zu starten, jedes mal, und falls Sie wissen genau, wie viel Leistung erzeugt wird, indem jeder Befehl, den Sie senden, können Sie das schreiben von Befehlen an stdin direkt und Lesen Sie die erwartete Anzahl der Zeilen von stdout/stderr - jedoch es ist leicht in die Sackgasse, und Sie müssen wissen, was Sie tun in diesem Fall.pexpect
- Modul, um die Kommunikation mit dem Kind-Prozess interaktiv wie in einem terminal. Siehe Warum man nicht einfach ein Rohr (popen())?Dank an alle, die irgendwie versucht mir zu helfen.
Als Lösung für das problem, ich habe die folgenden:
Erstellte ich eine Methode "Konsole" und alle anderen Methoden meiner Klasse ich starten.
Dies ist mein problem gelöst.
Danke
Bessere Weg ist, um zu tun, wie unten
Jeder sub-Prozess-Initialisierung muss gekapselt werden versuchen Sie zu fangen, zu behandeln resource allocation Fehler. Dann wieder, wenn Erfolg.
Bevor die Kommunikation gestartet wird, überprüfen Sie, ob der Kanal festgelegt ist (keine Fehler), dann kommunizieren.
Beste Weg ist, um "Popen" auf die gleiche Stelle, egal wo Sie kommunizieren.Sie können am Ende duplizieren "Popen" zwei mal. Aber das ist sicher.
Unbekannte interrupts zwischen "Popen" und "kommunizieren", wird Ihr python-job als Hänge ewig und müssen manuell töten. Dies ist sicherlich das, was wir nicht wollen, in der live -