Как очистить после subprocess.Popen?

У меня есть долго работающий скрипт python с подпроцессом perl worker. Данные отправляются в дочерний процесс и из него через его стандартный ввод и вывод. Периодически ребенок нужно перезапускать.

К сожалению, через некоторое время у него заканчиваются файлы («слишком много открытых файлов»). lsof показывает много оставшихся открытых каналов.

Какой правильный способ очистить после процесса Popen'd? Вот что я делаю прямо сейчас:

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()
15
задан dkuebric 17 February 2011 в 19:21
поделиться