Python cv2.imshow()不工作:无法连接到X s

2024-06-25 22:46:35 发布

您现在位置:Python中文网/ 问答频道 /正文

情境:在windows主机上的docker容器中运行CentOS终端。安装了cv2,工作正常。 脚本:

import sys
import cv2
def main(argv):
        inputfile = ''
        for arg in argv:
                img = cv2.imread(arg)
                cv2.imshow('Image', img)
                cv2.waitkey(0)
if __name__ == "__main__":
        main(sys.argv[1:])

错误:: cannot connect to X server
尝试的解决方案:
[root@b26030f33e65 PythonScripts]# xhost local:root xhost: unable to open display ""


Tags: todockerimportimgmainwindowssysarg
2条回答

在类unix的系统上,您可以通过设置一组所需的挂载,通过主机的X服务器(如果有的话)传递到docker容器(请参见this article for an idea)。在

由于您使用的是Windows,所以几乎不可能通过X从主机传递到容器,因为Windows不运行X服务器;它使用其他系统进行屏幕渲染。在

我认为对您来说唯一可能的解决方案是将一个目录从您的主机挂载到您的容器,并将您的映像写入该目录中的一个文件。这样就可以很容易地从主机系统访问它。在

只需使用类似以下参数运行容器:

docker run
   rm -ti
   volume /path/to/host/directory:/path/to/container/directory:rw
   entrypoint=/bin/bash
  yourcentosimagename

对于windows,您可以尝试各种Xserver实现之一,最简单的是VcXsrv,其他实现可以从Cygwin世界获得,也有一些商业解决方案。在

主要思想是启动Xserver,使其在所有接口上侦听TCP,并且不需要任何身份验证,然后通过TCP从容器连接到它

inside_container > export DISPLAY="<some ip>:0"
inside_container > # start your whatever

注意:监听所有接口而不使用auth是不安全的,你应该只在初始阶段使用它,直到你运行了,然后你应该采取必要的步骤来减少“暴露的表面”。在

现在。。。我不太确定如何使您的IP对容器可见,但我希望这足以让您开始。在

以后编辑: 我找到了this(过于复杂)的分步指南,基本上说的是几乎相同的事情:

  • 安装VcXsrv(或Xming,或其他任何东西)
  • 从以下几点开始:
    • “多窗口”提供更流畅的体验
    • “没有客户”
    • “禁用访问控制”(同样是为了避免最初的麻烦)
  • 每当您需要运行一些GUI应用程序时,添加一个指向您的“display”的DISPLAYenv var
^{pr2}$

相关问题 更多 >