簡體   English   中英

Python cv2.imshow() 不工作:無法連接到 X 服務器

[英]Python cv2.imshow() not working: cannot connect to X server

情況:在 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 ""

在類 unix 系統上,您可以通過設置一組必需的掛載將主機的 X 服務器(如果有的話)傳遞到 docker 容器(請參閱本文以了解想法)。

由於您在 Windows 上,因此幾乎不可能將 X 從主機傳遞到容器,因為 Windows 不運行 X 服務器; 它使用其他系統進行屏幕渲染。

我認為您唯一可能的解決方案是將主機上的目錄掛載到容器中,然后將圖像寫入該目錄中的文件。 然后可以從您的主機系統輕松訪問它。

只需使用 arguments 運行您的容器,類似於:

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

注意:監聽所有接口並且沒有身份驗證是不安全的,你應該只在初始階段使用它,直到你讓事情運行起來,之后你應該采取必要的步驟來減少“暴露表面”。

現在......我不太確定如何讓你 IP 對容器可見,但我希望這足以讓你開始。

稍后編輯:我發現了這個(過於復雜的)分步指南,它基本上說的幾乎相同:

  • 安裝 VcXsrv(或 Xming,或其他)
  • 從以下開始:
    • “多窗口”帶來更流暢的體驗
    • “沒有客戶”
    • “禁用訪問控制”(再次只是為了避免最初的麻煩)
  • 每當您需要運行一些 GUI 應用程序時,添加一個指向您的“顯示”的DISPLAY環境變量
# 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM