Versuchen Sie herauszufinden, wie Sie verhindern können, dass Xvfb-Prozesse in unserer Python-Anwendung hängen bleiben, wenn Sie PyVirtualDisplay verwenden. Das wesentliche Problem besteht darin, dass der Aufruf von display.stop()
(siehe Codebeispiel) den Xvfb-Prozess nicht ordnungsgemäß herunterzufahren scheint.Wie vermeidet man das Hängen von Xvfb-Prozessen [bei der Verwendung von PyVirtualDisplay]?
PyVirtualDisplay ist sehr einfach verwendet:
from pyvirtualdisplay import Display
display = Display(backend='xvfb')
display.start()
... # Some stuff happens here
display.stop()
Nun wird die Display-Klasse hat eine leichte Modifikation Xvfb verwenden, die TCP-Ports zu verhindern: im Grunde, -nolisten tcp
den Vollstreckungsbefehl hinzufügen. Die Änderung wird durch Überschreiben der entsprechenden XfvbDisplay Klasse _cmd Eigenschaft getan:
@property
def _cmd(self):
cmd = [PROGRAM,
dict(black='-br', white='-wr')[self.bgcolor],
'-screen',
str(self.screen),
'x'.join(map(str, list(self.size) + [self.color_depth])),
self.new_display_var,
'-nolisten',
'tcp'
]
return cmd
Was ist der richtige Weg, um die Xvfb Prozesse in diesem Zusammenhang zu beenden, so dass sie beendet sind und bleiben nicht?
Vielen Dank!
Wenn angenommen wird, dass pyvirtualdisplay 'subprocess.Popen' verwendet, könnten Sie terminate für diese Objekte aufrufen. Wenn Sie keinen Zugriff darauf erhalten, können Sie [os.kill] (http://docs.python.org/2/library/os.html#os.kill) für alle untergeordneten Prozesse verwenden. – alejandro