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

12

我们正在尝试找到如何在使用PyVirtualDisplay时避免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属性完成的:

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

非常感谢!


1
假设pyvirtualdisplay使用subprocess.Popen,您可以在这些对象上调用terminate。如果您无法访问它们,则可以尝试在所有子进程上使用os.kill - alejandro
3个回答


8

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

所以,您可以像这样做:

display.popen.terminate()

或者

display.popen.kill()

1
谢谢。如果我不能再访问显示对象了会发生什么?有没有比使用操作系统调用更好的方法来执行“kill”? - Juan Carlos Coto
1
这实际上就是它在幕后所做的事情。答案是否定的,其实不是。os.kill非常好用。它是一个不错的接口,你可以很容易地处理异常。 - Jordan

0

提供信息,这些解决方案都对我无效。它说display没有sendstop或popen属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接