目前遇到了兩種報這個錯的情況:
情況一:本地在外網,通過SSH登錄到內網服務器。運行代碼,
報錯:
(1)cannot connect to X server
(2)_tkinter.TclError: couldn't connect to display
或者運行完了也沒有任何顯示。
環境:本地:windows 10 遠程: linux ubuntu 16.04 連接方式:服務器在內網中,本地和內網之間通過VPN連接,然後本地通過SSH登錄到服務器
症狀:VNC可以遠程桌面到服務器,本地ping服務器通,服務器ping本地不通。(這個問題修復之後也是這樣,這裏只不過是交代一下環境。公司的VPN還挺厲害的,能控制很多東西)
原因:你的代理地址可能被某一個流氓軟件給改了!!
代碼(代碼放在服務器端,本地通過ssh登錄到服務器,然後運行這個代碼):
img_dir = '/home/data/1.jpg'
from matplotlib import pyplot as plt
img = plt.imread(img_dir)
plt.imshow(img)
plt.show()
mini example
$ export DISPLAY=10.xxx.xx.xxx:0.0
$ xarclock
Error: Can't open display: 10.xxx.xx.xxx:0.0
無論上述的display設置成什麼都不行!
或者
$ python3.6
Python 3.6.9 (default, Jul 3 2019, 15:36:16)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.namedWindow('img', 0)
或者在pycharm:
Traceback (most recent call last):
File "/home/usr1/abc.py", line 6, in <module>
plt.imshow(img)
File "/home/usr1/.local/lib/python3.6/site-packages/matplotlib/pyplot.py", line 2677, in imshow
__ret = gca().imshow(
File "/home/usr1/.local/lib/python3.6/site-packages/matplotlib/pyplot.py", line 926, in gca
return gcf().gca(**kwargs)
File "/home/usr1/.local/lib/python3.6/site-packages/matplotlib/pyplot.py", line 603, in gcf
return figure()
File "/home/usr1/.local/lib/python3.6/site-packages/matplotlib/pyplot.py", line 545, in figure
**kwargs)
File "/home/usr1/.local/lib/python3.6/site-packages/matplotlib/backend_bases.py", line 3252, in new_figure_manager
return cls.new_figure_manager_given_figure(num, fig)
File "/home/usr1/.local/lib/python3.6/site-packages/matplotlib/backends/_backend_tk.py", line 950, in new_figure_manager_given_figure
window = tk.Tk(className="matplotlib")
File "/usr/lib/python3.6/tkinter/__init__.py", line 2026, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: couldn't connect to display "10.xxx.xxx.xxx:0.0"
解決!!
這個問題不知道會不會折騰你一天,反正會折騰我一天!
用盡一切x server(xming xmanager vcxsrv, xshell moba-xterm, .........), ssh, 各種折騰都不管用的根源!!如下:
把你的C,,,L,,,O,,,U,,,D,,,S,,,,S之類的FQ軟件卸了。重啓電腦!!或者其他你不應該用的代理軟件。如果你跟我一樣是使用公司VPN上網的話!!!!!
然後使用 moba-xterm或者xmanager,它們都會自帶xserver。它們啓動之後,一般會啓動xserver
這樣你在moba-xterm或者xshell中使用ssh登錄到服務器然後再運行相應代碼
就可以在本地show出來圖片了
情況二:本地PC和服務器PC都在同一個內網,沒有使用VPN連接。本地代碼在Pycharm中修改提交,執行代碼是通過VNC遠程到服務器桌面,在桌面中的終端裏執行。
出現的症狀是:
1,代碼在pycharm中遠程執行正常 2,但是在VNC遠程桌面終端中執行報這個錯: :cannot connect to X server
不顯示cv2.imshow應該顯示的界面。
原因:還是$DISPLAY環境變量引起的。本地pycharm中在settings和run-> configuration中設置好了DISPLAY這個環境變量,但是遠程桌面的終端裏沒有設置好。其實上面這個報錯後面跟着的就是遠程桌面終端的DISPLAY這個環境變量的值,只不過因爲它是空,所以沒有顯示出來。
解決:可以另外打開一個終端,看一下應該設置成多少:$ echo $DISPLAY
$ echo $DISPLAY
# 輸出
:2.0
然後,在當前報錯的終端內按照看到的值進行設置(這個值其實和啓動VNC時設置的值一致:$ vncserver -geometry 1920x1080 :2)。如:
$ export DISPLAY=localhost:2.0
然後在原地重新運行代碼應就不報這個錯了,而且界面能顯示出來了。
同樣原因導致的問題見:
1,win10 pycharm 打不開 console Couldn't connect to console process Process finished with exit code 129
2,python win10 pycharm遠程連接ubuntu顯示不了圖片 cannot connect to X server 10.xxx.xxx.xxx:0.0