Python - sous-processus opération d'e/S sur fichier fermé
J'ai essayé avec la classe ci-dessous, exécuter des commandes en séquence avec subporcess module en 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)
Cependant, si j'ai essayer le code suivant, j'obtiens l'erreur:
ValueError: opération d'e /S sur fichier fermé
from pconsole import BaculaActions
myconsole = BaculaActions()
run = myconsole.run_job("xxxxx-data", "incremental")
delete = myconsole.del_jobid(25487)
Quelqu'un a idée de ce qui peut être mauvais?
Je remercie
Vous devez vous connecter pour publier un commentaire.
Le manuel dit qu'il est vraiment:
Après l'exécution de la première commande et obtenir le résultat, le " bconsole processus a résilié, les tubes sont fermés et donc l'erreur sur la deuxième
communicate
appel.communicate
- ce qui est le plus sûr moyen de le faire, ou si 'bconsole" prend trop de temps au démarrage à chaque fois, et si vous savez exactement combien de sortie est généré par chaque commande que vous envoyez, vous pouvez envoyer des commandes à stdin directement et lire le nombre de lignes de stdout/stderr - cependant, il est facile de blocage et vous avez besoin de savoir ce que vous faites dans ce cas.pexpect
module, pour communiquer avec le processus de l'enfant de manière interactive, comme si dans un terminal. Voir Pourquoi ne pas utiliser un tuyau (popen())?Merci à tous ceux qui en quelque sorte a essayé de m'aider.
Comme une solution au problème, j'ai fait la suivante:
J'ai créé une méthode "console" et toutes les autres méthodes de ma classe que je commence.
Cela a résolu mon problème.
Merci
Meilleur moyen est de faire comme ci-dessous,
Tout sous l'initialisation du processus doit être encapsulée dans des try catch, pour gérer l'allocation des ressources échecs. Puis, si le succès.
Avant de communiquer, vérifier si le canal est établi (aucune erreur) puis de communiquer.
Meilleure façon est de garder "Popen" sur la même place où vous le communiquer.Vous pouvez vous retrouver dupliquer "Popen" à deux reprises. Mais c'est sûr.
N'importe quel inconnu interrompt entre “Popen” et “communiquer”, fera de votre python travail comme la pendaison pour toujours et aura besoin d'un manuel de tuer. C'est certainement ce que nous ne voulons pas en live