Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python cv2.imshow()不工作:无法连接到X服务器_Python_Docker_Opencv_Terminal_Centos - Fatal编程技术网

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

Python cv2.imshow()不工作:无法连接到X服务器,python,docker,opencv,terminal,centos,Python,Docker,Opencv,Terminal,Centos,情况:在windows主机上的docker容器中运行CentOS终端。cv2已安装,工作正常。 脚本: 错误::无法连接到X服务器 尝试过的解决方案:[root@b26030f33e65PythonScripts]#xhost local:根 xhost:无法在类unix系统上打开display“”,您可以通过设置一组所需的装载,将主机的X服务器(如果有)传递到docker容器(请参阅) 由于您使用的是Windows,所以几乎不可能通过X从主机传递到容器,因为Windows不运行X服务器;它使用

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

错误:
:无法连接到X服务器

尝试过的解决方案:
[root@b26030f33e65PythonScripts]#xhost local:根

xhost:无法在类unix系统上打开display“”

,您可以通过设置一组所需的装载,将主机的X服务器(如果有)传递到docker容器(请参阅)

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

我认为唯一可行的解决方案是将一个目录从主机装载到容器中,并将映像写入该目录中的文件。然后就可以轻松地从主机系统访问它

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

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

对于windows,您可以尝试各种Xserver实现中的一种,最简单的一种是,Cygwin世界提供了其他实现,还有一些商业解决方案

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

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

您的docker CentOS中很可能没有安装X,因为它不会在屏幕上显示内容。我如何检查X是否已安装/如果未安装如何安装您需要将主机的X服务器装载到docker容器中,因为它是处理屏幕GUI应用程序的容器。也许这会有所帮助:看起来像是我需要的解决方案,但这是针对linux系统的。我的主机系统是windows。还有其他文档吗?Windows不提供X服务器,据我所知,只有客户端应用程序。将映像写入已装入卷上的文件不是一个解决方案吗?然后,您可以在主机系统上轻松访问/打开它,而不需要容器系统的窗口。答案是Thx,但我的目标是创建一个工具/脚本,以便我可以直接在终端中查看我的图像文件。我已经安装了一个卷,因此我可以通过将映像复制到主机系统来检查映像。这是解决我的问题的一个很好的方法,但我想为我的终端创建一个工具,以便在那里使用它。我一定会考虑这个解决方案。我只有两个问题:当我的容器已经被创建时,我还能传递DISPLAY env var吗?而传递到它的ip,是我主机的internat ip吗?只需使用localhost并用
-net=host
启动容器,显示环境变量定义必须在启动即将打开某个“GUI窗口”的工具/程序/脚本(甚至python shell)之前。。。我不确定您是否能够以某种方式将环境变量“注入”到正在运行的程序中。但是,如果您正在连接到一个正在运行的容器,并且即将启动一个新的工具/程序/脚本/。。。您可以定义环境变量,然后启动它。
inside_container > export DISPLAY="<some ip>:0"
inside_container > # start your whatever
# example
> docker run -ti --rm -e DISPLAY=172.17.0.1:0.0 firefox
> docker run -ti --rm -e DISPLAY=172.17.0.1:0.0 /bin/sh
# where "172.17.0.1" would be 1 of your IPs