如何避免挂起Xvfb进程[使用PyVirtualDisplay时]?

时间:2013-08-27 22:28:07

标签: python process subprocess xvfb pyvirtualdisplay

在使用PyVirtualDisplay时,试图找到如何避免在我们的Python应用程序中挂起Xvfb进程。基本问题是调用display.stop()(参见下面的代码示例)似乎没有正确关闭Xvfb进程。

PyVirtualDisplay使用非常简单:

from pyvirtualdisplay import Display

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

... # Some stuff happens here

display.stop()

现在,Display类略有修改以防止Xvfb使用TCP端口:基本上,将-nolisten tcp添加到执行命令。通过覆盖适当的XfvbDisplay类的_cmd属性来完成修改:

@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

在此上下文中结束Xvfb进程的正确方法是什么,以便它们终止并且不会延迟?

非常感谢!

2 个答案:

答案 0 :(得分:8)

您的显示器,因为它继承自EasyProcess,将在display.popen处具有popen属性。如果EasyProcess无法正常工作,您可以使用它来终止。

所以,你可以这样做:

display.popen.terminate()

display.popen.kill()

答案 1 :(得分:4)

The answer by Jordan对我不起作用。这很有效:

display.sendstop()