Proper Weg, um alle Dateien nach dem Unterprozess Popen zu schließen und zu kommunizieren
Wir haben einige Probleme mit den gefürchteten "zu vielen offenen Dateien" auf unserem Ubuntu Linux-Rechner, auf dem eine Python Twisted-Anwendung ausgeführt wird. An vielen Stellen in unserem Programm verwenden wir den Subprozess Popen, etwa so:
Popen('ifconfig ' + iface, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
output = process.stdout.read()
während wir an anderen Orten Subprozesskommunikation verwenden:
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)
Was genau muss ich in beiden Fällen tun, um offene Dateideskriptoren zu schließen? Python-Dokumentation ist diesbezüglich nicht klar. Nach allem, was ich erfahre (was falsch sein könnte), werden sowohl communication () als auch wait () in der Tat alle offenen FDS selbst bereinigen. Aber was ist mit Popen? Muss ich stdin, stdout und stderr explizit schließen, nachdem ich Popen angerufen habe, wenn ich nicht mitteile oder warte?