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

Python 如何避免挂起Xvfb进程[在使用PyVirtualDisplay时]?,python,process,subprocess,xvfb,pyvirtualdisplay,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.

试图找到在使用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进程的正确方法是什么,以便它们被终止并且不会继续


非常感谢

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

所以,你可以这样做:

display.popen.terminate()

不适合我。这起到了作用:

display.sendstop()

假设pyvirtualdisplay使用
subprocess.Popen
,您可以对这些对象调用terminate。如果您无法访问这些,那么可以尝试在所有子进程上使用。谢谢。如果我再也无法访问显示对象,会发生什么情况?有没有比使用操作系统调用更好的方法来执行
kill
呢?实际上,这也是它在幕后所做的。答案是不,不是真的。实际上,os.kill相当不错。这是一个不错的界面,你可以很容易地处理异常。
display.sendstop()