11

在使用 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 进程的正确方法是什么,以便它们被终止并且不会逗留?

非常感谢!

4

2 回答 2

8

由于它继承自 EasyProcess,因此您的显示将具有一个 popen 属性display.popen。如果 EasyProcess 不能正常工作,您可以使用它来终止。

因此,您可以执行以下操作:

display.popen.terminate()

或者

display.popen.kill()
于 2013-09-16T15:25:56.310 回答
8

乔丹的回答对我不起作用。这有效:

display.sendstop()
于 2016-02-15T22:05:57.157 回答