【发布时间】:2011-06-29 08:17:01
【问题描述】:
我有一个带有 perl 工作子进程的长时间运行的 python 脚本。数据通过其标准输入和标准输出传入和传出子进程。必须定期重新启动子进程。
不幸的是,运行一段时间后,文件用完了(“打开的文件太多”)。 lsof 显示了许多剩余的开放管道。
Popen 进程后清理的正确方法是什么?这是我现在正在做的事情:
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()
【问题讨论】:
-
Popen.kill(或Popen.terminate)是您最好的选择。 -
当你杀死它时,它是否会因为已经死亡以外的任何原因引发 OSError?
-
subprocess中有一个无关紧要的错误,但它可以为_cleanup()bugs.python.org/issue1731717 提供一些启示 -
如果您不在 Windows 上,请使用
close_fds=True(py3k 上的默认值) -
顺便说一句,在某些系统上,打开文件的数量限制非常小。
标签: python subprocess pipe popen lsof