jupyter和pyzmq之间的一些个奇葩坑

文章目录

  • 导读
  • 发现问题
  • GitHub版本回溯查询
  • 你以为这就结束了?
  • 又好气又好笑的bug
  • 你以为又双叒叕结束了?

导读

估计不少人和我遇到了同样的问题,jupyter-clientpyzmq两个永远不在同一个星球的家伙。这次将解决方法记下来,免得以后遇到了还是得重新找解决方案。

发现问题

如果全都是安装最新版,那么jupyter-clientpyzmq永远都能保持一致,因为互相都是依赖最新的内容,互相都在进步。

可问题是,我目前需要安装的是paddle2.0。整理其中的依赖,会发现有这些东西:

名称 版本
Jinja2 3.1.2
MarkupSafe 2.1.1
absl-py 1.1.0
click 8.1.3
cloudpickle 1.6.0
flask 2.1.2
flask-cors 3.0.10
grpcio 1.47.0
importlib-metadata 4.12.0
itsdangerous 2.1.2
markdown 3.3.7
parl 2.0.4
psutil 5.9.1
pyzmq 18.1.1
scipy 1.7.3
tb-nightly 1.15.0a20190801
tensorboardX 1.8
termcolor 1.1.0
typing-extensions 4.3.0
werkzeug 2.1.2
zipp 3.8.0

其中,我们可以看到,pyzmq的版本是 18.1.1 18.1.1 18.1.1。而jupyterlab 3.2.9 3.2.9 3.2.9版本中,pyzmq的版本是 23.2.0 23.2.0 23.2.0,两者差得不是一点半点。

那么问题要怎么解决呢?

可惜的是,目前找遍全网并没有说明一个可行的版本规则,于是只能回去查询GitHub中的源码看有没有提示。

GitHub版本回溯查询

一番查询,找到了jupyter的官方代码库。

想起来之前在使用Git提交代码的时候,能够通过tag参数说明当前提交的库处于什么版本,知名度稍微高一点的多人协作框架都会有这样的规定。然后就想到可以通过tag查询历年版本。

怎么查询呢?我们先看到官方库的首页,这里有显示当前分支是主分支的main,看到了吗?就在左上方。

jupyter和pyzmq之间的一些个奇葩坑_第1张图片
点开他,就会发现列出了很多内容。你会看到其实有两个选项卡,一个表示当前的分支,一个表示当前的tag,或者说你想把他翻译为【标签】或者【版本号】也是可以的,因为大家都把tag当作版本号。

jupyter和pyzmq之间的一些个奇葩坑_第2张图片

在这里肯定是选择Tags选项卡了。毕竟你也看到了,截图中展示的就是分支名称,这谁看得懂啊。直接切换Tags选项卡查看历史版本。

jupyter和pyzmq之间的一些个奇葩坑_第3张图片

是不是一目了然?所以还是得强调一下规范的作用。如果他们要是在tag里面说一堆醉汉一样的胡话,那就彻底没办法了。

什么?你说项目保密?字段全用aaa表示?方便别人看不懂?那,祝你好运。

好了,剩下的就是一点点找了。

最终,我在这里发现了一个很大的改动,也就是在v7.2.0中的requirements.txt和v7.2.1中的requirements.txt里面是这么限定的:

名称 v7.2.0中的版本 v7.2.1中的版本
entrypoints 不限 不限
jupyter_core ≥ 4.9.2 \ge4.9.2 4.9.2 ≥ 4.9.2 \ge4.9.2 4.9.2
nest-asyncio ≥ 1.5.1 \ge1.5.1 1.5.1 ≥ 1.5.4 \ge1.5.4 1.5.4
python-dateutil ≥ 2.1 \ge2.1 2.1 ≥ 2.8 \ge2.8 2.8
pyzmq ≥ 17 \ge17 17 ≥ 22.3 \ge22.3 22.3
tornado ≥ 5.0 \ge5.0 5.0 ≥ 6.0 \ge6.0 6.0
traitlets 不限 不限

好了,发现问题。能够支持当前paddle2.0的最高版本也就只有jupyter-client的7.2.0的版本。

那就下载嘛。

pip install jupyter-client==7.2.0

虽然下载之后jupyter-client还是会下载较新的pyzmq,但是这个时候再次使用命令:

pip install pyzmq==18.1.1

这时将不会再报错。

你以为这就结束了?

还有个幺蛾子:protobuf版本不对应。

如果版本过于超前,将会报错,所以选择较低版本:

pip install protobuf==3.19.4

需要注意的是,两个等号前后不要有空格,否则会被认定为install命令的参数而出现各种各样奇奇怪怪的错误。

又好气又好笑的bug

安装好了protobuf之后,又开始报错:

NameError: name 'batch' is not defined

一开始我还以为是版本问题,结果发现已经有人踩坑了,还发了一个issue,当然最后还有一个回答:

装好了重启内核。—— rancheng commented on 3 Jul 2021

结果还真解决了。

当然也有没解决的情况,比如会报错:

libSM.so.6: cannot open shared object file: No such file or directory

如果不是内核没重启的问题就是linux本身没有库的问题,按照这篇博客给的方法安装就好了:

apt-get install -y libsm6 libxext6 libxrender-dev

你以为又双叒叕结束了?

飞桨不支持Ubuntu2204。参见这篇博客:PaddlePaddle 尚不支持 Ubuntu22.04 | 作者:zhqh100

如果你很不幸地使用了Ubuntu2204,这意味着你以前的所有踩坑全是白费的。

相当的绝望呢。

你可能感兴趣的:(随笔,jupyter,flask,python)