![](/img/trans.png)
[英]python cv2.imshow() is working for root, but not for other users on raspberry pi
[英]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 對容器可見,但我希望這足以讓你開始。
稍后編輯:我發現了這個(過於復雜的)分步指南,它基本上說的幾乎相同:
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.