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