6

我有一个运行 Python/JupyterLab 和所有依赖项的容器。我开始:

docker run --rm -it -p 8888:8888 \
  --mount type=bind,source=/project,target=/work \
  python-3.9.1-jupyterlab

它启动 jupyterlab,我可以通过浏览器进行连接。万事皆安。


现在我正在尝试使用 VSCode 作为 Python IDE。将 VSCode 中的 shell 附加到我的容器会很有帮助,这样我就可以在一个地方运行 iPython 并编辑我的代码。我从 VSCode Docker 扩展运行“附加外壳”:

docker exec -it {containerID} bash <

然后我打开一个 iPython shell:

jo@:~/work $ ipython --pylab

Python 3.9.1
IPython 7.20.0 -- An enhanced Interactive Python.
Using matplotlib backend: agg

In [1]: matplotlib.get_backend()
Out[1]: 'agg'

In [2]: import matplotlib.pyplot as plt

In [3]: plt.plot([1.6, 2.7])
Out[3]: [<matplotlib.lines.Line2D at 0x7f5ed0ed8d30>]

In [4]: plt.show()

In [5]: %matplotlib inline

In [6]: plt.plot([1.6, 2.7])
Out[6]: [<matplotlib.lines.Line2D at 0x7f5ed0df5d60>]
<Figure size 432x288 with 1 Axes>

In [7]: plt.show()

我看不到任何情节。我试过用不同的后端渲染它们(默认是'agg')。我认为这是因为内核——在容器上执行——不能利用主机图形(即内核可以渲染绘图但不能显示它们)。也许我没有正确映射主机/容器端口。

有人可以就尝试的事情提供一些指导吗?这是我正在使用的容器的图像

4

1 回答 1

3

您在不是图形环境的 shell 中运行 jupyterlab。此外,如果您从非 X11 桌面运行 Docker 容器,则不会设置 DISPLAY 变量(X11 用于显示图形)。如果您从 linux 桌面运行它,您可以将环境设置为允许 X11,如本例所示,但并非所有环境都相同,您可能需要进一步研究如何设置特定环境以允许来自 docker 的 X11 服务器与宿主机上的 X11 客户端通信的容器(注意在 X11 中,应用程序是server,桌面是client

在 Linux 上,如果未设置环境变量 DISPLAY,则“事件循环”被标识为“无头”,这会导致回退到非交互式后端 (agg)。您可以在 matplotlib文档中阅读有关后端以及如何选择它们的更多信息。一旦“偶数循环”设置为“无头”,所有的渲染都将在文件中完成。您可以查看有关如何在此后端使用 mahtplotlib 的答案。

使用 Jupyther 和 VSCode 的好处的一个好方法是使用 VSCode 的扩展。最受欢迎的扩展之一是 微软开发的jupyter。该扩展程序将使您拥有与使用浏览器相同的体验。

于 2021-03-02T08:57:05.850 回答