2013-08-27 11 views
10

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!

+1

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

Antwort

7

Ihre Anzeige, da sie von EasyProcess erbt, wird ein Popen-Attribut bei display.popen haben. Sie können damit beenden, wenn EasyProcess nicht ordnungsgemäß funktioniert.

So können Sie etwas tun:

display.popen.terminate() 

oder

display.popen.kill() 
+1

Danke. Was passiert, wenn ich keinen Zugriff mehr auf das Anzeigeobjekt habe? Gibt es eine schönere Methode, ein "Kill" auszuführen als einen OS-Aufruf? –

+1

Das macht es auch hinter den Kulissen. Die Antwort ist nein, nicht wirklich. os.kill ist eigentlich ziemlich gut. Es ist eine anständige Schnittstelle und Sie können Ausnahmen leicht genug behandeln. – Jordan