python - 使用来自 Google Cloud Platform 计算引擎的远程 ssh 解释器在 PyCharm 中显示本地 matplotlib

标签 python matplotlib ssh google-cloud-platform pycharm

我目前正在 GCP 上的两个虚拟机实例上通过 Mac 上运行的本地 PyCharm session 运行 Python 3.5 脚本(有关详细环境规范,请参阅下文)。

我在 GCP 中有两个看起来相似的不同项目。我与我们的云管理员一起检查了他们的设置,我们看不到任何重大差异,至少没有任何微不足道的差异。我使用以下云 SDK 命令行在 GCP 上创建了两个深度学习镜像,每个项目中一个:

export PROJECT=[MY_PROJECT_NAME]

export INSTANCE_ROOT=$USER-vm
export ZONE=europe-west4-a
export IMAGE_FAMILY=tf-latest-gpu
export INSTANCE_TYPE=n1-highmem-8

export GPU_TYPE=v100
export GPU_COUNT=1
export INSTANCE_NAME=$INSTANCE_ROOT-$GPU_TYPE-$GPU_COUNT
gcloud compute instances create $INSTANCE_NAME \
        --zone=$ZONE \
        --image-family=$IMAGE_FAMILY \
        --image-project=deeplearning-platform-release \
        --maintenance-policy=TERMINATE \
        --accelerator=type=nvidia-tesla-$GPU_TYPE,count=$GPU_COUNT \
        --machine-type=$INSTANCE_TYPE \
        --boot-disk-size=200GB \
        --metadata=install-nvidia-driver=True \
        --scopes=storage-rw

两张图片完全相似。

我在 PyCharm 中配置了两个远程 ssh 解释器,并在两台虚拟机上部署了我的 Python 代码。在 VM 实例配置(操作系统、Python 版本/库、源代码等)和 PyCharm 远程解释器配置方面,一切都绝对相似。 在这两种情况下,到实例的 ssh 入口连接(在端口 22 上)都运行良好。

然而,当调用plt.show()时要使用 matplotlib 显示图像,图像会在一种设置中显示,但不会在另一种设置中显示。

这不是设置正确的 ssh 配置(命令行上的 -X 选项、 X11Forwarding 等)的问题。我已经检查过这一点,无论如何,我的一个虚拟机在这个配置中显示我的图像方面做得非常好。

我调试了执行,发现PyCharm通过实现自己的matplotlib自动处理X显示FigureCanvas 。在远程 ssh 中时,show()函数实际上在定义的主机(即我的本地 Mac)上打开一个套接字并发送要显示的缓冲区:

    sock = socket.socket()
    sock.connect((HOST, PORT))
    [..]
    sock.send(buffer)

这正是我的两种配置的分歧之处:

  1. 工作人员尝试连接 localhost:53725并成功: <socket.socket fd=28, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 42316), raddr=('127.0.0.1', 53725)>

  2. 失败者尝试连接 localhost:53725也一样,但有一个异常(exception)。

我最强烈的假设是,两个 GCP 项目中的某些网络配置有所不同,并阻止 localhost:53725 上的连接对于第二个。 然而,除此之外,我不知道会发生什么和/或如何解决它。

任何想法/建议将不胜感激。

谢谢, 洛朗

--

详细环境规范: PyCharm 2018.2.4(专业版) 内部版本 #PY-182.4505.26,建于 2018 年 9 月 19 日 获得 PyCharm Evaluator 许可 有效期:2018 年 10 月 27 日 JRE:1.8.0_152-release-1248-b8 x86_64 JVM:JetBrains s.r.o 的 OpenJDK 64 位服务器 VM macOS 10.14

最佳答案

好的。这似乎是一个错误,我找到了解决方法。 我分享它是因为它可能会为遇到同样问题的任何人节省数小时的故障排除和调试时间。

当您保持在同一个 PyCharm session 中并从一种解释器切换到另一种解释器时,实际上会出现此问题。 如果您退出 PyCharm 并再次启动它,本地显示将与您首先运行的解释器/VM 一起使用。然后,如果切换到第二个,就会失败。 一切看起来都好像 PyCharm 在端口或其他任何地方设置了某种锁,这会阻止您从一种解释器无缝切换到另一种解释器。

我将与 PyCharm 支持团队分享这些见解。顺便说一句,除此之外,这种具有远程解释器的本地显示功能非常棒并且工作得很好。

关于python - 使用来自 Google Cloud Platform 计算引擎的远程 ssh 解释器在 PyCharm 中显示本地 matplotlib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52713682/

相关文章:

python - loc 和 ix 之间的意外差异

python - 在 Python 中导入模块作为包的一部分*以及*以独立工作的方式

python - 如何反向索引 Counter 并将其转换为 defaultdict? Python

python - 如何控制plt.quiver?

linux - AWS Ec2 - SCP 文件传输权限被拒绝

python - 是否有任何 python 模块可以在文本模式下绘制二维笛卡尔坐标?

python - 导入错误 : No module named _backend_gdk

python - rio.plot.show 带颜色条?

perl - Perl SSH到设备

linux - 使用 Netbeans 的远程 SSH/SFTP