上两篇文章
中讲了Jupyter的主要部署方法,老实说,对新手很不友好,我也不想再经历一次这样的过程,尤其是Basemap的安装。所以,咱直接打包个镜像吧。不得不说Docker真是个拯救了无数程序猿秀发的好工具。
使用截图
![]() | ![]() |
|---|---|
![]() | ![]() |
简单来说,这就是一个部署在服务器上的Anaconda,用的的Jupyterlab的界面,您可以随时随地在任意电脑上打开一个浏览器(IE除外),输入服务器的网址,用户密码就能打开,还能下载数据,计算,绘图,整合了常用的Grads,Fortran的内核,安装了Basemap,Metpy,Siphon,Atmos,ecmwf_api,NCL_to_Python等Python常用气象工具包。
Quick Start
如果你想快速部署,而没有时间看完教程的话,看这里就好。或者看Gitee上本项目的主页。
首先安装Docker,方法见Docker常用命令总结
1docker pull registry.cn-shanghai.aliyuncs.com/bugatii100peagle/jupytercgmsabefcn:v1
2cd ~
3mkdir jupyterlab
4mkdir jupyterlab/workspace
5docker run --name jupytercgmsabefcn -d -p 8000:8888 -v `pwd`:/workspace -w /workspace -e GRANT_SUDO=yes --user root registry.cn-shanghai.aliyuncs.com/bugatii100peagle/jupytercgmsabefcn:v1 jupyter-lab --no-browser --port=8888 --ip=0.0.0.0 --allow-root
预计安装时间4小时(博主使用家用WiFi,视网络环境时间可能有延长),其中安装Docker用 1~2 小时,拖取jupytercgmsabefcn镜像用2小时。run起来之后,浏览器打开http://IP:8080,密码是空密码,直接回车即可。
Tips
- 不要在jupyterlab直接挂在阿里云OSS,OSS擅长存储不擅长访问。
jupyterlab/workspace是用于暂存的工作空间,在此文件夹下读写数据和作图都比较快速。jupyterlab下另建一个新文件夹用于挂载阿里云OSS或FTP,workspace下文件编写完成再归档至此OSS文件夹。既能保证数据不丢失,又能保证读写速度。
C 和 Grads 的插件
我的镜像是很久以前我就装好了的,拖取的是官方的 jupyter-science 已经预装好了python3 julia R 我后来又装了C Grads,至于怎么装的我忘了,不过机智的我打包了镜像。直接拖下来用就行。
【 2020-02-20 14:26:59】我想起来了,好像是在Jupyter-Docker-stacks上找的jupyter-datascience-notebook,我好像还把Scipy删掉了。

1docker pull registry.cn-shanghai.aliyuncs.com/bugatii100peagle/jupytercgrads
2docker run --name jupyter -d -p 8000:8888 --restart=always -v `pwd`/jupyterlab/workspace:/workspace -w /workspace -e GRANT_SUDO=yes --user root 127.0.0.1:5000/jupytercgrads jupyter-lab --no-browser --port=8888 --ip=0.0.0.0 --allow-root
安装运行参考我之前写的jupyterLab安装配置教程,运行界面如下

气象绘图工具包 Metpy Siphon atmos
参考Meetpy Installation Guide和在Jupyter中安装Python包,docker exec -it jupyter bash进入镜像后,输入如下代码
1python -m pip install metpy
2python -m pip install siphon
atoms要手动安装,下载代码后再install
1wget https://files.pythonhosted.org/packages/65/1b/9e08dbd6979877cb1d24b5b3ee607c91ece212b010b49715ca7443999e24/atmos-0.2.5.tar.gz
2tar -xvf atmos-0.2.5.tar.gz
3cd atmos-0.2.5
4nano setup.py
修改片段
1from setuptools import setup
2from pip..req import parse_requirements
3#修改片段,不然会发生报错 ModuleNotFoundError: No module named 'pip.req'
4from setuptools import setup
5from pip._internal.req import parse_requirements
保存退出再执行
1python setup.py install
参考install quantopian时出现No module named pip.req的解决办法
地图支持包Basemap
1conda update -n base conda
2conda update -n base conda # 对,更新两次,直到不会再提示更新
更新这步都很费时间,保守估计两小时。为什么说是估计呢,因为后面我没熬住,睡着了。然后参考解决conda的“Solving environment: failed”问题和anaconda安装basemap运行如下代码。
1conda config --set channel_priority flexible
2conda install basemap
弹出如下信息即表示,已经找到basemap安装包,conda install basemap反而安装挺快,快到让我怀疑昨晚熬夜的两小时还失败了是不是幻觉。
1The following NEW packages will be INSTALLED:
2
3 basemap conda-forge/linux-64::basemap-1.2.1-py37hd1be537_2
4 geos conda-forge/linux-64::geos-3.8.0-he1b5a44_0
5 proj4 conda-forge/linux-64::proj4-5.2.0-he1b5a44_1006
6 pyproj conda-forge/linux-64::pyproj-1.9.6-py37h516909a_1002
7 pyshp conda-forge/noarch::pyshp-2.1.0-py_0
测试运行,会遇到basemap KeyError ‘PROJ_LIB’解决办法,解决办法就是代码中指定目录运行。终端输入
1whereis proj
2# 输出:proj: /usr/share/proj /opt/conda/bin/proj
浏览器打开jupyter,新建.ipynb文件,输入
1%matplotlib inline
2import os
3os.environ['PROJ_LIB'] = "/usr/share/proj"
4import numpy as np
5import matplotlib.pyplot as plt
6from mpl_toolkits.basemap import Basemap
7
8plt.figure(figsize=(8, 8))
9m = Basemap(projection='ortho', resolution=None, lat_0=50, lon_0=-100)
10m.bluemarble(scale=0.5);
参考数据科学 IPython 笔记本 8.16 地理数据和 Basemap无报错,并出现一个地球,即表示安装成功。

basemap还挺大,装了2G左右吧。

Basemap 的继承者 Cartopy
Basemap 自2020年开始停止维护,所以,新的项目还是用新工具吧。
1wget https://files.pythonhosted.org/packages/e5/92/fe8838fa8158931906dfc4f16c5c1436b3dd2daf83592645b179581403ad/Cartopy-0.17.0.tar.gz
2tar zxvf Cartopy-0.17.0.tar.gz
3cd Cartopy-0.17.0
4python setup.py install
网不好的也可以尝试从百度网盘下载
1链接:https://pan.baidu.com/s/1EOofzd9VcFgYTbpRhDf5pg
2提取码:c60e
测试,浏览器打开jupyter输入以下代码,能出土没报错即可。
1import cartopy.crs as ccrs
2import matplotlib.pyplot as plt
3
4ax = plt.axes(projection=ccrs.PlateCarree())
5ax.coastlines()
6
7# Save the plot by calling plt.savefig() BEFORE plt.show()
8# plt.savefig('coastlines.pdf')
9# plt.savefig('coastlines.png')
10plt.show()

Ncar的NCL_to_Python
参考Important letter regarding the future of NCL和PyNIO和PyNGL。但是PyNIO和PyNGL与basemap冲突,climate-dev mailing list archives,也提到对代码做了修改,反正这两货不能在一起,那就打包两个,幸好之前docker了镜像。

从刚安装号atmos的那个镜像开始,运行并进入镜像。
1conda config --set channel_priority flexible
2conda install xarray netcdf4 scipy pyngl pynio ncl
测试,浏览器打开jupyterlab,上传下面这个包,解压,打开,运行其中的文件,没报错,出图即可。
1链接:https://pan.baidu.com/s/1lpBJTJHp466zbru9cKtoTg
2提取码:8q3y

欧洲中心数据下载ecmwf-api
参考利用Python调用ECMWF欧洲中心API批量下载数据,python调用ECMWF欧洲中心api下载数据
1python -m pip install ecmwf-api-client
测试,打开ipython,输入下方代码,没报错即可。
1from ecmwfapi import ECMWFDataServer
Fortran支持jupyter-fortran-kernel
下载插件包上传之服务器解压安装。
1链接:https://pan.baidu.com/s/1EAkEEVtmuOyB_VtzEAMqrQ
2提取码:d4l6
3复制这段内容后打开百度网盘手机App,操作更方便哦
1apt install gfortran
2unzip jupyter-fortran-kernel-master.zip
3cd jupyter-fortran-kernel-master
4python setup.py install
5jupyter-kernelspec install fortran_spec/
打开浏览器,就可以看到Fortran的选项

点击打开,输入
1program aa
2implicit none
3print*,'Hello World'
4end

镜像包信息
jupytercgrads_metpy_siphon_atmos_basemap_ecmwf_fortran_cartopy
jupytercgrads_metpy_siphon_atmos_ncl_ecmwf_fortran
失败的方法安装地图支持包BaseMap
首先安装依赖包
1python -m pip install geos
2python -m pip install pip
3python -m pip install Pillow
参考basemap安装教程,linux python 安装basemap
1pip install pyproj
测试,bash输入以下命令没报错即可。
1python -c 'import pyproj'
basemap的包真的好难下,我这里存了个百度网盘,需要的自行下载。
1链接:https://pan.baidu.com/s/1hMhdVfVb1n709bxnSJCECg
2提取码:a1cw
参考python番外(2)——Basemap安装
上传服务器到Docker环境,这里可以用workspace目录,反正装完删掉就可以。
1tar zxvf basemap-1.1.0.tar.gz
2cd basemap-1.0.7/geos-3.3.3/
3export GEOS_DIR=/usr/local
4./configure --prefix=$GEOS_DIR
5make
能解压个二十分钟左右吧,慢慢等着,然后make报错。
1return (ISNAN(x) && ISNAN(y) && ISNAN(z));
2 ^~~~~
3../../../include/geos/geom/Coordinate.inl:39:10: note: suggested alternative: ‘SN AN’
4return (ISNAN(x) && ISNAN(y) && ISNAN(z));
5 ^~~~~
6 SNAN
7../../../include/geos/geom/Coordinate.inl: In member function ‘bool geos::geom::C oordinate::equals3D(const geos::geom::Coordinate&) const’:
8../../../include/geos/geom/Coordinate.inl:83:21: error: ‘ISNAN’ was not declared in this scope
9 ((z == other.z)||(ISNAN(z) && ISNAN(other.z)));
10 ^~~~~
11../../../include/geos/geom/Coordinate.inl:83:21: note: suggested alternative: ‘SN AN’
12 ((z == other.z)||(ISNAN(z) && ISNAN(other.z)));
13 ^~~~~
14 SNAN
15make[4]: *** [Makefile:373: IndexedPointInAreaLocator.lo] Error 1
16make[4]: Leaving directory '/workspace/basemap-1.1.0/geos-3.3.3/src/algorithm/loc ate'
17make[3]: *** [Makefile:392: all-recursive] Error 1
18make[3]: Leaving directory '/workspace/basemap-1.1.0/geos-3.3.3/src/algorithm/loc ate'
19make[2]: *** [Makefile:444: all-recursive] Error 1
20make[2]: Leaving directory '/workspace/basemap-1.1.0/geos-3.3.3/src/algorithm'
21make[1]: *** [Makefile:476: all-recursive] Error 1
22make[1]: Leaving directory '/workspace/basemap-1.1.0/geos-3.3.3/src'
23make: *** [Makefile:368: all-recursive] Error
解决办法参考GEOS安装出错
1cd include/geos/
2nano platform.h
修改24行
1/* Has isnan */
2/* #undef HAVE_ISNAN */
改为
1/* Has isnan */
2#define HAVE_ISNAN 1
然后 不要configure 直接 make 然后 make install
make 也要个40多分钟吧
【 2020-02-18 0:23:56】 一个小时,反正也就只有等着。
【 2020-02-18 1:08:34】 又一个小时,我好想睡觉,但是不看他装完我睡不着。
【 2020-02-18 1:28:23】我好像想起来我折腾这玩意这么慢了,这是在OSS下,为了方便管理代码,我挂载了OSS盘做储存,OSS擅长存而不擅长高频访问,而编译make就是个高频的活动。
【 2020-02-18 1:39:44】脱离OSS目录重新configure nano platform.h make
【2020-02-18 1:44:01 】make 完毕,make install 不到30秒完毕。2/100*60=1.2,也就是说我花了两小时等一个1分20秒就能出的东西,还傻等了两小时。
但是我回到basemap文件夹下python setup.py install 时报错
1In file included from src/_geoslib.c:248:0:
2/usr/local/include/geos_c.h:149:22: note: expected ‘GEOSMessageHandler {aka void (*)(const char *)}’ but argument is of type ‘void (*)(char *, char *)’
3 extern void GEOS_DLL initGEOS(GEOSMessageHandler notice_function,
4···
5src/_geoslib.c:5619:13: error: ‘PyThreadState {aka struct _ts}’ has no member named ‘exc_traceback’; did you mean ‘curexc_traceback’?
6 tstate->exc_traceback = local_tb;
7 ^~~~~~~~~~~~~
8 curexc_traceback
9error: Command "gcc -pthread -B /opt/conda/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/usr/local/include -I['/opt/conda/lib/python3.7/site-packages/numpy/core/include'] -I/opt/conda/lib/python3.7/site-packages/numpy/core/include -I/opt/conda/include/python3.7m -c src/_geoslib.c -o build/temp.linux-x86_64-3.7/src/_geoslib.o -MMD -MF build/temp.linux-x86_64-3.7/src/_geoslib.o.d" failed with exit status 1
参考 Python踩坑之路, Python 3.7 Build failure: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_type’; did you mean ‘curexc_type’? #11
1pip install PyOpenGL PyOpenGL_accelerate
2apt-get install python3-dev
3apt-get install libevent-dev
当然都没有解决。


