小编dku*_*ric的帖子

subprocess.Popen后如何清理?

我有一个长期运行的python脚本与perl worker子进程.数据通过stdin和stdout发送进出子进程.必须定期重新启动孩子.

不幸的是,经过一段时间的运行,它耗尽了文件('太多的打开文件').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()
Run Code Online (Sandbox Code Playgroud)

python subprocess pipe lsof popen

15
推荐指数
1
解决办法
2万
查看次数

标签 统计

lsof ×1

pipe ×1

popen ×1

python ×1

subprocess ×1