PyCharm和Docker解释器的X11转发

10
我正在使用Docker解释器在PyCharm中开发项目,但在进行大多数“交互式”操作时遇到问题。例如:
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [4, 5, 6])

给予

RuntimeError: Invalid DISPLAY variable

我可以通过绕过这个来实现

import matplotlib
matplotlib.use('agg')

在我执行plt.show()时没有生成任何绘图,尽管已经消除了错误。当我从Pandas中导入后尝试进行调试时,我也遇到了与该线程中相同的错误:“无法连接到X服务器”。但我无法SSH连接到我的Docker容器,因此那里提出的解决方案不起作用。我已经看到了将“-e DISPLAY=$DISPLAY”传递到“docker run”命令中的解决方案,但我不认为PyCharm具有指定类似这样的命令行参数的Docker解释器的功能。是否有任何方法设置某种永久、通用的X11转发(如果确实是根本原因),以便将图形传递到我的本地机器上的DISPLAY?更普遍地说,有人在PyCharm的Docker解释器中成功使用过Matplotlib吗?


你能否使用docker exec进入容器而不是ssh? - Mano Marks
如果我手动启动容器,但PyCharm会自动完成这一切,并且对此非常保密 - 我在文档中看到它每次都会创建一个新的容器,因此exec肯定行不通。 - Charles Davis
你找到这个问题的解决方案了吗? - JP.
你的本地机器是Mac还是Linux? - andrew_reece
@andrew_reece 为我提供 Mac。 - JP.
2个回答

3

这是我想出来的解决方案。希望能帮助其他人。具体步骤如下:

  1. 安装并运行Socat

    socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"

  2. 安装并运行XQuartz(可能已经安装)

  3. 编辑PyCharm项目的运行/调试配置,设置适当的DISPLAY变量地址(在我的情况下为192.168.0.6:0)

运行/调试项目会导致一个新的quartz弹出窗口显示绘制的图形,无需保存到图像等操作。


2
在主机上运行 xhost + 并将这些选项添加到 docker run: -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix

@JP。这个修复了你的问题吗? - Robert
@Robert 还没有,但这可能更多是因为我对pycharm/docker集成的理解有限。看起来pycharm会从镜像中启动自己的容器(参见原帖中关于参数的评论),所以我无法像这条评论中那样设置环境/卷信息。 - JP.
回复之前的评论。我刚刚注意到我可以通过Pycharm中的debug/run配置添加docker标志。明天会试一下并报告结果。 - JP.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接