2013-08-27 10 views
10

Próba znalezienia sposobu na uniknięcie zawieszania procesów Xvfb w naszej aplikacji Python podczas korzystania z PyVirtualDisplay. Zasadniczy problem polega na tym, że wywołanie display.stop() (patrz przykładowy kod poniżej) nie wydaje się prawidłowo wyłączać procesu Xvfb.Jak uniknąć zawieszania procesów Xvfb [podczas używania PyVirtualDisplay]?

PyVirtualDisplay jest bardzo prosty używane:

from pyvirtualdisplay import Display 

display = Display(backend='xvfb') 
display.start() 

... # Some stuff happens here 

display.stop() 

Teraz klasa Wyświetlacz ma lekką modyfikację aby zapobiec Xvfb z użyciem portów TCP: w zasadzie, dodać -nolisten tcp z poleceniem wykonania. Modyfikacja odbywa się poprzez nadpisanie właściwości _cmd odpowiedniej klasy XfvbDisplay za:

@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 

Co to jest właściwy sposób, aby zakończyć procesy Xvfb w tym kontekście tak, że są one zakończone i nie marudzić?

Dziękuję bardzo!

+1

Zakładając, że pyvirtualdisplay używa 'subprocess.Popen', możesz wywołać zakończyć na tych obiektach. Jeśli nie możesz uzyskać do nich dostępu, możesz spróbować użyć [os.kill] (http://docs.python.org/2/library/os.html#os.kill) we wszystkich procesach potomnych. – alejandro

Odpowiedz

7

Twój wyświetlacz, ponieważ dziedziczy po EasyProcess, będzie miał atrybut popen na display.popen. Możesz użyć tego do zakończenia, jeśli EasyProcess nie działa poprawnie.

Tak, można zrobić coś takiego:

display.popen.terminate() 

lub

display.popen.kill() 
+1

Dzięki. Co się stanie, jeśli nie mam już dostępu do obiektu wyświetlanego? Czy jest lepszy sposób na "zabijanie" niż przy użyciu wywołania systemu operacyjnego? –

+1

To właśnie robi za kulisami. Odpowiedź brzmi: nie, nie bardzo. os.kill jest całkiem niezły. Jest to przyzwoity interfejs i możesz z łatwością obsługiwać wyjątki. – Jordan

Powiązane problemy