Comment nettoyer après subprocess.Popen?
J'ai une longue durée d'exécution de script python, perl travailleur sous-processus. Les données sont envoyées dans et hors de l'enfant proc grâce à son stdin et stdout. Périodiquement, l'enfant doit être redémarré.
Malheureusement, après un certain temps de fonctionnement, il exécute les fichiers ("trop de fichiers ouverts'). lsof montre que beaucoup reste tuyaux ouverts.
Quelle est la bonne manière de nettoyer après une Popen avais processus? Voici ce que je suis en train de faire maintenant:
def start_helper(self):
# spawn perl helper
cwd = os.path.dirname(__file__)
if not cwd:
cwd = '.'
self.subp = subprocess.Popen(['perl', 'theperlthing.pl'], shell=False, cwd=cwd,
stdin=subprocess.PIPE, stdout=subprocess.PIPE,
bufsize=1, env=perl_env)
def restart_helper(self):
# clean up
if self.subp.stdin:
self.subp.stdin.close()
if self.subp.stdout:
self.subp.stdout.close()
if self.subp.stderr:
self.subp.stderr.close()
# kill
try:
self.subp.kill()
except OSError:
# can't kill a dead proc
pass
self.subp.wait() # ?
self.start_helper()
source d'informationauteur dkuebric | 2011-02-17
Vous devez vous connecter pour publier un commentaire.
Je pense que c'est tout ce dont vous avez besoin:
Autant que je sache, tous les objets de fichier sera fermée avant la popen le processus est tué.
Une expérience rapide montre que
x = open("/etc/motd"); x = 1
nettoie après lui-même et ne laisse pas de descripteur de fichier ouvert. Si vous déposez la dernière référence à unsubprocess.Popen
les tuyaux semblent rester dans les parages. Est-il possible que vous ré-invoquerstart_helper()
(ou même de quelques autresPopen
), sans explicitement la fermeture et l'arrêt de l'ancienne?