Python 如何通过SSH连接到docker映像,而不使用;无效的显示变量"-本地docker会话正常工作时matplotlib出错?

Python 如何通过SSH连接到docker映像,而不使用;无效的显示变量"-本地docker会话正常工作时matplotlib出错?,python,docker,matplotlib,ssh,Python,Docker,Matplotlib,Ssh,我在我的Ubuntu 18.04 linux机器上运行/托管了一个完全工作的docker映像。但是,通过PowerShell从我的Win10笔记本电脑通过SSH连接到物理机器: ssh username@machine 当我尝试通过ssh远程执行代码时,matplotlib确实出现以下错误: Traceback (most recent call last): File "foo", line 284, in <module> cnnTrainTestApply.app

我在我的Ubuntu 18.04 linux机器上运行/托管了一个完全工作的docker映像。但是,通过PowerShell从我的Win10笔记本电脑通过SSH连接到物理机器:

ssh username@machine
当我尝试通过ssh远程执行代码时,matplotlib确实出现以下错误:

Traceback (most recent call last):
  File "foo", line 284, in <module>
    cnnTrainTestApply.applyStructureDetectionNet(absPathToCsvFiles, absPathToCnnOutputFiles)
  File "/home/dev/foo.py", line 702, in bar
    plt.figure(figsize=(15, 15))
  File "/opt/conda/lib/python3.5/site-packages/matplotlib/pyplot.py", line 539, in figure
    **kwargs)
  File "/opt/conda/lib/python3.5/site-packages/matplotlib/backend_bases.py", line 171, in new_figure_manager
    return cls.new_figure_manager_given_figure(num, fig)
  File "/opt/conda/lib/python3.5/site-packages/matplotlib/backend_bases.py", line 177, in new_figure_manager_given_figure
    canvas = cls.FigureCanvas(figure)
  File "/opt/conda/lib/python3.5/site-packages/matplotlib/backends/backend_qt5agg.py", line 35, in __init__
    super(FigureCanvasQTAggBase, self).__init__(figure=figure)
  File "/opt/conda/lib/python3.5/site-packages/matplotlib/backends/backend_qt5.py", line 235, in __init__
    _create_qApp()
  File "/opt/conda/lib/python3.5/site-packages/matplotlib/backends/backend_qt5.py", line 122, in _create_qApp
    raise RuntimeError('Invalid DISPLAY variable')
RuntimeError: Invalid DISPLAY variable
回溯(最近一次呼叫最后一次):
文件“foo”,第284行,在
cnnTrainTestApply.applyStructureDetectionNet(AbsPathToCsviles,absPathToCnnOutputFiles)
文件“/home/dev/foo.py”,第702行,在条形图中
plt.图(figsize=(15,15))
文件“/opt/conda/lib/python3.5/site packages/matplotlib/pyplot.py”,图中第539行
**kwargs)
文件“/opt/conda/lib/python3.5/site packages/matplotlib/backend_base.py”,第171行,在new_figure_manager中
返回cls.new\u figure\u manager\u给定\u figure(数值,图)
文件“/opt/conda/lib/python3.5/site packages/matplotlib/backend\u base.py”,第177行,在新的\u图\u管理器\u给定的\u图中
画布=cls.FigureCanvas(图)
文件“/opt/conda/lib/python3.5/site packages/matplotlib/backends/backend_qt5agg.py”,第35行,在__
超级(FigureCanvasQTAggBase,self)。\uuuuu init\uuuuuu(figure=figure)
文件“/opt/conda/lib/python3.5/site packages/matplotlib/backends/backend_qt5.py”,第235行,在__
_创建_qApp()
文件“/opt/conda/lib/python3.5/site packages/matplotlib/backends/backend_qt5.py”,第122行,在_create_qApp中
raise RUNTIMERROR('显示变量无效')
运行时错误:显示变量无效
既不是这个,也不是
ssh-Xusername@machine
在成功中一定要让步。在没有ssh的情况下直接在我的机器上工作不会产生任何问题。我想是缺少一个正在运行的XServer,或者类似的东西

ssh连接有什么问题?我如何解决这个问题


由于matplotlib需要运行qt5后端,我不能简单地避免将主机系统的X-server转发给docker。

此解决方案是一种解决方案,需要一个具有活动X-server的登录用户。这不是最优的

SSH连接过程中缺少假定显示。要将其用于matplotlib,我们必须执行以下操作:

ssh登录后,在主机系统“machine”上键入以下命令,然后再连接到docker映像

export DISPLAY=:1

这可能取决于您的机器设置,只要X-Server与当前用户一起运行,您可能需要将
echo$DISPLAY
的输出作为导出,而不是
1
。只要提供相同的用户名,这就应该有效

我认为在过去一个月左右的时间里,至少有两个类似的问题。如果你在意,你可以搜索它们并将它们链接到你的解决方案(或建议标记为重复)。哦,我一直在搜索我的问题,但没有发现任何真正类似的问题。我对我的回答也不完全满意。如果你不介意,可以给我发相应的链接。在任何情况下,对不起,可能有一个多余的问题问!我也没有找到他们,所以我只是在这里提到。你的解决方案似乎至少比我记忆中下面的任何评论都要好得多;因此,这将更像是为那些用户提供的一项服务。它的可能副本并不是该问题的副本。因为我的问题不是将X11转发给docker,所以这很好。这是关于不让X-Server在运行docker的主机上运行。当没有什么可以前进时,你就不能前进。谢谢你的链接!它提供了一些见解。更具体地说,docker使用的qt5后端要求运行Xserver。规避X-Server转发目前不是一个选项。