2013-08-27 31 views
10

Cố gắng tìm cách tránh treo các quy trình Xvfb trong ứng dụng Python của chúng tôi, khi sử dụng PyVirtualDisplay. Vấn đề quan trọng là gọi display.stop() (xem mẫu mã bên dưới) dường như không tắt đúng quy trình Xvfb.Làm thế nào để tránh treo các quá trình Xvfb [trong khi sử dụng PyVirtualDisplay]?

PyVirtualDisplay rất đơn giản được sử dụng:

from pyvirtualdisplay import Display 

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

... # Some stuff happens here 

display.stop() 

Bây giờ, lớp hiển thị có một sửa đổi nhỏ để ngăn chặn Xvfb từ việc sử dụng các cổng TCP: về cơ bản, thêm -nolisten tcp cho lệnh thực hiện. Việc sửa đổi được thực hiện bằng cách ghi đè bất động sản _cmd lớp XfvbDisplay của thích hợp:

@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 

cách thích hợp để kết thúc quá trình Xvfb trong bối cảnh này để họ được chấm dứt và không nán lại là gì?

Cảm ơn rất nhiều!

+1

Giả sử pyvirtualdisplay sử dụng 'subprocess.Popen', bạn có thể gọi chấm dứt trên các đối tượng đó. Nếu bạn không thể truy cập vào chúng, bạn có thể thử sử dụng [os.kill] (http://docs.python.org/2/library/os.html#os.kill) trên tất cả các tiến trình con. – alejandro

Trả lời

7

Màn hình của bạn, vì nó được kế thừa từ EasyProcess, sẽ có thuộc tính popen tại display.popen. Bạn có thể sử dụng để chấm dứt, nếu EasyProcess không hoạt động đúng cách.

Vì vậy, bạn có thể làm một cái gì đó như thế này:

display.popen.terminate() 

hoặc

display.popen.kill() 
+1

Cảm ơn. Điều gì xảy ra nếu tôi không có quyền truy cập vào đối tượng hiển thị nữa? Có cách nào tốt hơn để thực hiện một 'kill' hơn là sử dụng một cuộc gọi hệ điều hành? –

+1

Đó là những gì nó làm đằng sau hậu trường quá, thực sự. Câu trả lời là không, không thực sự. os.kill là khá tốt thực sự. Đó là một giao diện khá và bạn có thể xử lý các ngoại lệ một cách dễ dàng đủ. – Jordan

Các vấn đề liên quan