Maneira correta de fechar todos os arquivos após o subprocesso do Popen e se comunicar
Estamos tendo alguns problemas com os temidos "muitos arquivos abertos" em nossa máquina Ubuntu Linux executando um aplicativo Twisted python. Em muitos lugares do nosso programa, estamos usando o subprocesso Popen, algo como isto:
Popen('ifconfig ' + iface, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
output = process.stdout.read()
enquanto em outros lugares usamos subprocesso de comunicação:
process = subprocess.Popen(['/usr/bin/env', 'python', self._get_script_path(script_name)],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
close_fds=True)
out, err = process.communicate(data)
O que exatamente eu preciso fazer nos dois casos para fechar qualquer descritor de arquivo aberto? A documentação do Python não está clara sobre isso. Pelo que entendi (o que poderia estar errado), comunicar () e esperar () realmente limparão todos os fds abertos por conta própria. Mas e o Popen? Preciso fechar stdin, stdout e stderr explicitamente depois de ligar para o Popen se eu não ligar para comunicar ou esperar?