赞
踩
盖房子的时候,木料的选择是个问题。
木匠的目标本质上就是携带好的切割工具。在他有时间的时候,会将他的设备磨得很锋利。
{–:}——宫本武藏(五轮书)
本文摘自《Python大数据分析(第2版)》第2章
对于Python新手来说,Python的部署似乎很简单。丰富的可选安装库和程序包也很容易安装。首先,Python不止一种,它有许多不同的“风味”,如CPython、Jython、IronPython和PyPy。然后,Python 2.7和3.x也是不同的世界。[1]
即便在你决定了使用版本之后,部署也很困难,原因如下:
幸运的是,我们可以求助于工具和策略。本章将介绍以下有助于Python部署的技术。
pip和conda等包管理器用于安装、更新和删除Python软件包;它们还有助于保持不同包的版本一致性。
virtualenv或 conda等虚拟环境管理器可以并行管理多种Python安装(例如,在单一机器上安装Python 2.7和3.7,以便无风险地测试某个有趣的Python软件包的最新开发版本)。[2]
Docker容器代表着包含运行特定软件所需的全部系统部件(如代码、运行时库或系统工具)的完整文件系统。例如,你可以在运行macOS或者Windows10的一台机器上,在一个Docker容器里运行Ubuntu 18.04操作系统,并在其中安装Python 3.7和单独的Python代码。
为金融应用部署Python代码通常要求高可用性、安全性和高性能;这些需求一般只能利用专业计算及存储基础设施满足。目前,这种基础设施以情况良好的云实例形式存在,规模从小到不等。与长期租赁的专用服务器相比,云实例(也就是虚拟服务器)的好处之一是,用户通常只需要按照实际使用的时间付费;另一个好处是,这种云实例在需要时一两分钟内就能投入使用,有助于敏捷开发并提高伸缩性。
本章的结构如下。
本节介绍作为Python包管理器使用的Conda。
这一节专注于conda作为虚拟环境管理器的功能。
这一节简单概述了Docker容器化技术,聚焦于构建带有Python 3.7安装的Ubuntu容器。
本节介绍在云中部署Python和Jupyter Notebook的方法,后者是一个基于浏览器的、功能强大的Python部署工具套件。
本章的目标是在专业基础设施上建立一个合适的Python环境,包含最重要的工具以及数值、数据分析和可视化软件包(库)。此后,这一组合将作为实现和部署后续章节中Python代码的支柱,不管这些代码是交互式的金融分析代码,还是以脚本和模块形式出现的。
conda可以单独安装,但是更有效的方法之一是通过Miniconda安装,这是一个包含conda、并将conda作为包和虚拟环境管理器使用的最小化Python分发版本。
Miniconda可用于Windows、macOS和Linux。您可以从Miniconda网页上下载不同的版本。以下假定安装的是Python 3.7 64位版本。本节的主要例子是基于Ubuntu的Docker容器中的一个会话,通过 wget 下载 Linux 64 位安装程序,然后安装Miniconda。下面的代码应该可以在任何Linux或者macOS机器上正常工作(可能需要做少量修改)。
$ docker run -ti -h py4fi -p 11111:11111 ubuntu:latest /bin/bash root@py4fi:/# apt-get update; apt-get upgrade -y ... root@py4fi:/# apt-get install -y bzip2 gcc wget ... root@py4fi:/# cd root root@py4fi:~# wget \ > https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh \ > -O miniconda.sh ... HTTP request sent, awaiting response... 200 OK Length: 62574861 (60M) [application/x-sh] Saving to: 'miniconda.sh' miniconda.sh 100%[====================>] 59.68M 5.97MB/s in 11s 2018-09-15 09:44:28 (5.42 MB/s) - 'miniconda.sh' saved [62574861/62574861] root@py4fi:~# bash miniconda.sh Welcome to Miniconda3 4.5.11 In order to continue the installation process, please review the license agreement. Please, press ENTER to continue >>>
按Enter键开始安装过程。阅读许可协议后,单击“yes”按钮同意条款。
... Do you accept the license terms? [yes|no] [no] >>> yes Miniconda3 will now be installed into this location: /root/miniconda3 - Press ENTER to confirm the location - Press CTRL-C to abort the installation - Or specify a different location below [/root/miniconda3] >>> PREFIX=/root/miniconda3 installing: python-3.7. ... ... installing: requests-2.19.1-py37_0 ... installing: conda-4.5.11-py37_0 ... installation finished.
同意许可条款并确认安装位置之后,你应该再次单击“yes”按钮,允许 Miniconda 将新的Miniconda安装位置附加到PATH环境变量中。
Do you wish the installer to prepend the Miniconda3 install location
to PATH in your /root/.bashrc ? [yes|no]
[no] >>> yes
Appending source /root/miniconda3/bin/activate to /root/.bashrc
A backup will be made to: /root/.bashrc-miniconda3.bak
For this change to become active, you have to open a new terminal.
Thank you for installing Miniconda3!
root@py4fi:~#
此后,你可能想要升级conda和Python。[3]
root@py4fi:~# export PATH="/root/miniconda3/bin/:$PATH"
root@py4fi:~# conda update -y conda python
...
root@py4fi:~# echo ". /root/miniconda3/etc/profile.d/conda.sh" >> ~/.bashrc
root@py4fi:~# bash
在这一相当简单的安装过程之后,您就可以使用基本的Python安装和conda了。基本Python安装包含了一些很好的功能,如SQLite3数据库引擎。在对应的环境变量中附加相关路径(正如前面所做的那样)之后,您可以试验能否从新的Shell实例中启动Python:
root@py4fi:~# python
Python 3.7.0 (default, Jun 28 2018, 13:15:42)
[GCC 7.2.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print('Hello Python for Finance World.')
Hello Python for Finance World.
>>> exit()
root@py4fi:~#
conda可用于高效地处理Python软件包的安装、更新和删除。接下来概述一下主要功能。
conda install python=x.x
conda update python
conda install $PACKAGE_NAME
conda update $PACKAGE_NAME
conda remove $PACKAGE_NAME
conda update conda
conda search $SEARCH_TERM
conda list
考虑到这些功能,安装Numpy——所谓“科学栈”中最重要的库之一——只需要一条命令。在装有Intel处理器的机器上安装时,将自动安装Intel数学核心库(Intel Math Kernel Library,MKL),这个库不仅能加速NumPy的数值运算,而且对其他几个Python科学库也有作用。[4]
root@py4fi:~# conda install numpy Solving environment: done ## Package Plan ## environment location: /root/miniconda3 added / updated specs: numpy The following packages will be downloaded: Package | build ---------------------------|----------------- mkl-2019.0 | 117 204.4 MB intel-openmp-2019.0 | 117 721 KB mkl_random-1.0.1 | py37h4414c95_1 372 KB libgfortran-ng-7.3.0 | hdf63c60_0 1.3 MB numpy-1.15.1 | py37h1d66e8a_0 37 KB numpy-base-1.15.1 | py37h81de0dd_0 4.2 MB blas-1.0 | mkl 6 KB mkl_fft-1.0.4 | py37h4414c95_1 149 KB ------------------------------------------------------------ Total: 211.1 MB The following NEW packages will be INSTALLED: blas: 1.0-mkl intel-openmp: 2019.0-117 libgfortran-ng: 7.3.0-hdf63c60_0 mkl: 2019.0-117 mkl_fft: 1.0.4-py37h4414c95_1 mkl_random: 1.0.1-py37h4414c95_1 numpy: 1.15.1-py37h1d66e8a_0 numpy-base: 1.15.1-py37h81de0dd_0 Proceed ([y]/n)? y Downloading and Extracting Packages mkl-2019.0 | 204.4 MB | ###################################### | 100% ... numpy-1.15.1 | 37 KB | ###################################### | 100% numpy-base-1.15.1 | 4.2 MB | ###################################### | 100% ... root@py4fi:~#
也可以一次性安装多个软件包。-y
标志表示所有(可能的)问题都以yes回答。
root@py4fi:/# conda install -y ipython matplotlib pandas pytables scikit-learn \
> scipy
...
pytables-3.4.4 | 1.5 MB | ##################################### | 100%
kiwisolver-1.0.1 | 83 KB | ##################################### | 100%
icu-58.2 | 22.5 MB | ##################################### | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
root@py4fi:~#
安装过程结束后,除了标准库之外,一些重要的金融分析库也已经可用,包括:
改进的交互式Python shell;
Python标准绘图库;
用于高效处理数组;
用于管理表格数据,例如金融时间序列数据;
Python HDF5库封装器;
机器学习和相关任务所用的软件包;
一组科学类和函数(以依赖的形式安装)。
这就为数据分析、特别是金融分析提供了一个基本工具集。下面的例子使用IPython和NumPy提取了一组伪随机数。
root@py4fi:~# ipython Python 3.7.0 (default, Jun 28 2018, 13:15:42) Type 'copyright', 'credits' or 'license' for more information IPython 6.5.0 -- An enhanced Interactive Python. Type '?' for help. In [1]: import numpy as np In [2]: np.random.seed(100) In [3]: np.random.standard_normal((5, 4)) Out[3]: array([[-1.74976547, 0.3426804 , 1.1530358 , -0.25243604], [ 0.98132079, 0.51421884, 0.22117967, -1.07004333], [-0.18949583, 0.25500144, -0.45802699, 0.43516349], [-0.58359505, 0.81684707, 0.67272081, -0.10441114], [-0.53128038, 1.02973269, -0.43813562, -1.11831825]]) In [4]: exit root@py4fi:~#
执行conda list
命令显示已安装的软件包。
root@py4fi:~# conda list # packages in environment at /root/miniconda3: # # Name Version Build Channel asn1crypto 0.24.0 py37_0 backcall 0.1.0 py37_0 blas 1.0 mkl blosc 1.14.4 hdbcaa40_0 bzip2 1.0.6 h14c3975_5 ... python 3.7.0 hc3d631a_0 ... wheel 0.31.1 py37_0 xz 5.2.4 h14c3975_4 yaml 0.1.7 had09818_2 zlib 1.2.11 ha838bed_2 root@py4fi:~#
如果不再某个包需要,可以用conda remove
将其高效删除。
root@py4fi:~# conda remove scikit-learn Solving environment: done ## Package Plan ## environment location: /root/miniconda3 removed specs: - scikit-learn The following packages will be REMOVED: scikit-learn: 0.19.1-py37hedc7406_0 Proceed ([y]/n)? y Preparing transaction: done Verifying transaction: done Executing transaction: done root@py4fi:~#
conda的包管理器功能相当实用。然而,在加上虚拟环境管理器后,你才能看出它的全部威力。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J6n4OCQP-1582770738682)(/api/storage/getbykey/screenshow?key=18013c684ffc590e9219)]
简易包管理
conda做为包管理器,可以使Python软件包的安装、更新和删除变得很简单。没有必要自行构建和编译软件包——考虑到软件包指定的依赖列表和不同操作系统所需考虑的细节,这一步有时可能很棘手。
根据您所选择的安装程序版本,Miniconda提供了默认的Python 2.7或者3.7安装。conda的虚拟环境管理器可以允许不同的组合,例如,在Python 3.7默认安装的基础上增加一个完全独立的Python 2.7.x安装。为此,conda提供了以下功能。
conda create --name $ENVIRONMENT_NAME
conda activate $ENVIRONMENT_NAME
conda deactivate $ENVIRONMENT_NAME
conda env remove --name $ENVIRONMENT_NAME
conda env export > $FILE_NAME
conda env create -f $FILE_NAME
conda info --envs
下面的代码是一个简单的示意:创建一个名为py27的环境,在其中安装IPython,并执行一行Python 2.7.x代码。
root@py4fi:~# conda create --name py27 python=2.7 Solving environment: done ## Package Plan ## environment location: /root/miniconda3/envs/py27 added / updated specs: - python=2.7 The following NEW packages will be INSTALLED: ca-certificates: 2018.03.07-0 ... python: 2.7.15-h1571d57_0 ... zlib: 1.2.11-ha838bed_2 Proceed ([y]/n)? y Preparing transaction: done Verifying transaction: done Executing transaction: done # # To activate this environment, use: # > conda activate py27 # # To deactivate an active environment, use: # > conda deactivate # root@py4fi:~#
注意激活环境之后提示符的变化(py27)。
root@py4fi:~# conda activate py27
(py27) root@py4fi:~# conda install ipython
Solving environment: done
...
Executing transaction: done
(py27) root@py4fi:~#
最后,以下代码允许你以Python 2.7语法使用IPython。
(py27) root@py4fi:~# ipython
Python 2.7.15 |Anaconda, Inc.| (default, May 1 2018, 23:32:55)
Type "copyright", "credits" or "license" for more information.
IPython 5.8.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
Help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: print "Hello Python for Finance World!"
Hello Python for Finance World!
In [2]: exit
(py27) root@py4fi:~#
如上例所示,将conda作为虚拟环境管理器使用,你可以同时安装不同的Python版本,你还可以安装某些包的不同版本。默认Python的安装不受这一过程的影响,存在于同一台机器上的其他环境也是如此。conda env list
可显示所有可用环境。
(py27) root@py4fi:~# conda env list
# conda environments:
#
base /root/miniconda3
py27 * /root/miniconda3/envs/py27
(py27) root@py4fi:~#
有时候,您需要与其他人共享环境信息,或者在多台机器上使用环境信息。为此,可以用conda env export
将已安装程序包列表导出到一个文件中。这只默认适用于使用相同操作系统的机器,因为结果YAML文件中指定构建版本,但可以将其删掉,只指定软件包版本。
(py27) root@py4fi:~# conda env export --no-builds > py27env.yml
(py27) root@py4fi:~# cat py27env.yml
name: py27
channels:
- defaults
dependencies:
- backports=1.0
...
- python=2.7.15
...
- zlib=1.2.11
prefix: /root/miniconda3/envs/py27
(py27) root@py4fi:~#
从技术上说,虚拟环境不过是一个特定的(子)文件夹结构,创建它们往往是为了进行一些快速测试[5]。在这种情况下,停止后的环境很容易用conda env remove
删除。
(py27) root@py4fi:/# conda deactivate root@py4fi:~# conda env remove -y --name py27 Remove all packages in environment /root/miniconda3/envs/py27: ## Package Plan ## environment location: /root/miniconda3/envs/py27 The following packages will be REMOVED: backports: 1.0-py27_1 ... zlib: 1.2.11-ha838bed_2 root@py4fi:~#
conda的虚拟环境管理器的功能概述到此结束。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2yaSY054-1582770738683)(/api/storage/getbykey/screenshow?key=18013c684ffc590e9219)]
简易环境管理
conda不仅有助于包管理,还是Python的虚拟环境管理器。它简化了不同Python环境的创建,允许在同一台机器上使用多个版本的Python和可选包,这些不同版本不会互相影响。conda还可以导入环境信息,因此你可以轻松地在多台机器上复制环境,或者与他人共享。
Docker容器已经征服了IT界。虽然这种技术仍然相对年轻,但已经为几乎所有类型软件应用的高效开发与部署确立了一个标杆。
在本书中,你可以将Docker容器看作一个独立(“容器化”)文件系统,它包含操作系统(例如Ubuntu Sercer 18.04)、(Python)运行时库、其他系统与开发工具,以及需要的其他(Python)库和软件包。这样的一个Docker容器可以运行在Windows 10本地机器上,或者使用Linux操作系统的云实例上。
本节不打算介绍Docker容器所有激动人心的细节,而是简洁地说明Docker技术在Python开发领域所能发挥的能力。[6]
不过,在说明之前,我们必须区分Docker的两个基本概念。首先是Docker镜像(Image),它可以比作Python的一个类。其次是Docker容器,它可以比作对应Python类的一个实例。[7]
您可以从Docker词汇表上找到镜像更为技术性的定义:
Docker镜像是容器的基础。镜像是根文件系统变化和用于容器运行时库内部的对应执行参数的一个有序集合。镜像通常包含一组相互堆叠的分层文件系统,它没有状态,也永远不会变化。
类似地,您可以在Docker词汇表上找到容器的定义,这使得与Python类和类实例的对比变得很清晰:
容器是Docker镜像的运行时实例。一个Docker实例包括:一个Docker镜像、一个执行环境和一个标准指令集。
根据操作系统的不同,Docker的安装略有不同,这就是本节不做详述的原因。更多的信息和链接可以在About Docker CE页面上找到。
本节举例说明基于Ubuntu最新版本的Docker镜像的构建方法,镜像中还包括Miniconda和几个重要的Python软件包。此外,通过更新Linux软件包索引、在必要时升级软件包并安装某些附加的系统工具,我们可以进行一些Linux的“内务整理”工作。这方面的工作需要两个脚本,一个是完成所有Linux层面工作的bash脚本[8]。另一个是所谓的Dockerfile,即控制镜像本身的构建过程。
例2-1中的bash安装脚本包括3个主要部分。第一部分处理Linux“内务”。第二部分安装Miniconda,而第3部分安装Python可选程序包。更详细的注释请见脚本。
例2-1 安装Python和可选包的脚本
#!/bin/bash # # Script to Install # Linux System Tools and # Basic Python Components # # Python for Finance, 2nd ed. # (c) Dr. Yves J. Hilpisch # # GENERAL LINUX apt-get update # updates the package index cache apt-get upgrade -y # updates packages # installs system tools apt-get install -y bzip2 gcc git htop screen vim wget apt-get upgrade -y bash # upgrades bash if necessary apt-get clean # cleans up the package index cache # INSTALL MINICONDA # downloads Miniconda wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O \ Miniconda.sh bash Miniconda.sh -b # installs it rm -rf Miniconda.sh # removes the installer export PATH="/root/miniconda3/bin:$PATH" # prepends the new path # INSTALL PYTHON LIBRARIES conda update -y conda python # updates conda & Python (if required) conda install -y pandas # installs pandas conda install -y ipython # installs IPython shell
例2-2中的Dockerfile使用例2-1中的bash脚本,从而构建了一个新的Docker镜像。它的主要部分也有内嵌注释。
例2-2 构建镜像的Dockerfile
# # Building a Docker Image with # the Latest Ubuntu Version and # Basic Python Install # # Python for Finance, 2nd ed. # (c) Dr. Yves J. Hilpisch # # latest Ubuntu version FROM ubuntu:latest # information about maintainer MAINTAINER yves # add the bash script ADD install.sh / # change rights for the script RUN chmod u+x /install.sh # run the bash script RUN /install.sh # prepend the new path ENV PATH /root/miniconda3/bin:$PATH # execute IPython when container is run CMD ["ipython"]
如果这两个文件在一个文件夹里且安装了Docker,那么构建新镜像就很简单了。这里为镜像使用了ubuntupython
标签,这个标签是引用镜像时必需的,例如在根据它运行容器时。
~/Docker$ docker build -t py4fi:basic . ... Removing intermediate container 5fec0c9b2239 ---> accee128d9e9 Step 6/7 : ENV PATH /root/miniconda3/bin:$PATH ---> Running in a2bb97686255 Removing intermediate container a2bb97686255 ---> 73b00c215351 Step 7/7 : CMD ["ipython"] ---> Running in ec7acd90c991 Removing intermediate container ec7acd90c991 ---> 6c36b9117cd2 Successfully built 6c36b9117cd2 Successfully tagged py4fi:basic ~/Docker$
现有Docker镜像可以用docker images
列出。新镜像出现在列表的开头:
(py4fi) ~/Docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
py4fi basic f789dd230d6f About a minute ago 1.79GB
ubuntu latest cd6d8154f1e1 9 days ago 84.1MB
(py4fi) ~/Docker$
成功地构建py4fi:basic
之后,您就可以用docker run
运行对应的Docker容器。参数组合-ti
是在Docker容器内部运行交互过程(如Shell过程)时所需的(参见docker run
参考页面):
~/Docker$ docker run -ti py4fi:basic Python 3.7.0 (default, Jun 28 2018, 13:15:42) Type 'copyright', 'credits' or 'license' for more information IPython 6.5.0 -- An enhanced Interactive Python. Type '?' for help. In [1]: import numpy as np In [2]: a = np.random.standard_normal((5, 3)) In [3]: import pandas as pd In [4]: df = pd.DataFrame(a, columns=['a', 'b', 'c']) In [5]: df Out[5]: A b c 0 -1.412661 -0.881592 1.704623 1 -1.294977 0.546676 1.027046 2 1.156361 1.979057 0.989772 3 0.546736 -0.479821 0.693907 4 -1.972943 -0.193964 0.769500 In [6]:
退出IPython也将退出该容器,因为IPython是容器中运行的唯一应用程序。不过,您可以输入Ctrl-P、Ctrl-Q卸下容器。
卸下容器之后,docker ps
命令仍会显示运行中的容器(以及当前运行的其他任何容器):
~/Docker$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
e815df8f0f4d py4fi:basic "ipython" About a minute ago Up About a minute
4518917de7dc ubuntu:latest "/bin/bash" About an hour agoUp About an hour
d081b5c7add0 ubuntu:latest "/bin/bash" 21 hours ago Up 21 hours
~/Docker$
Docker容器的连接可用docker attach
C
O
N
T
A
I
N
E
R
I
D
<
/
c
o
d
e
>
命
令
完
成
(
注
意
,
<
c
o
d
e
>
CONTAINER_ID</code>命令完成(注意,<code>
CONTAINERID</code>命令完成(注意,<code>CONTAINER_ID
只需要几个字符就够了):
~/Docker$ docker attach e815d
In [6]: df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 3 columns):
a 5 non-null float64
b 5 non-null float64
c 5 non-null float64
dtypes: float64(3)
memory usage: 200.0 bytes
In [7]: exit
~/Docker$
exit
命令会终止IPython并停止Docker容器。容器可用docker rm
删除:
~/Docker$ docker rm e815d
e815d
~/Docker$
类似地,如果不再需要Docker容器py4fi:basic
,可以通过docker rmi
删除。虽然容器相对轻量,但单独容器仍可能消耗相当一部分存储容量。以py4fi:basic
为例,其大小接近2GB。这也就是您可能想要定期清理Docker镜像列表的原因:
~/Docker$ docker rmi 6c36b9117cd2
当然,关于Docker容器及其在某些应用场景中的好处,还有许多值得的讲解。但对于本书,您只需要知道,容器为部署Python、在完全独立(容器化)的环境中完成Python开发和为交付算法交易代码提供了一种现代化方法,就足够了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gm2xDST8-1582770738684)(/api/storage/getbykey/screenshow?key=18013c684ffc590e9219)]
Docker容器的好处
如果您还没有使用Docker容器,应该考虑试试它。它们为Python部署与开发工作提供了许多好处,不仅在本地工作时如此,在使用远程云实例与服务器部署算法交易代码时更具优势。
本节介绍在DigitalOcean云实例上建立全套Python基础架构的方法。其他的云提供商还有很多,如业界领先的Amazon Web Services。但是Digital Ocean以简易而闻名,对于小型云实例(称作水滴(Droplet))来说,价格也相对低。研究和开发通常使用最小的Droplet就足够了,其费用只有每月5美元(或者每小时0.007美元)。收费按小时计算,因此人们可以轻松地使用一个Droplet两个小时,然后将其删除,这只需要支付0.014美元。[9]
本节的目标是在DigitalOcean上建立一个Droplet,它包含Python 3.7安装包和典型的软件包(例如Numpy、Pandas),并与一个密码保护、用安全套接字层(SSL)加密的Jupyter Notebook服务器安装相结合。这个服务器安装将提供3个可通过常规浏览器使用的重要工具。
流行的交互开发环境,其特点是可以选择不同语言内核(例如,Python、R和Julia)。
可通过浏览器访问的系统Shell实现,能完成所有典型系统管理任务、对Vim和git等实用工具的使用。
基于浏览器的文件编辑器,可以对许多不同编程语言及文件类型的语法高亮显示,还具有典型的文本/代码编辑功能。
在Droplet上安装Jupyter Notebook之后,您可以通过浏览器进行Python开发和部署,而不需要通过安全外壳(SSH)访问、登陆云实例。
要实现本节的目标,需要几个文件。
这个脚本协调所有必要步骤,例如将其他文件复制到Droplet中,并在其上运行。
这个脚本用于安装Python、附加软件包和Jupyter Notebook,并启动Jupyter Notebook服务器。
这个文件用于配置Jupyter Notebook服务器,例如有关密码保护的细节。
这两个文件是Jupyter Notebook服务器SSL加密时所需的。
下面的小节以相反的次序来处理上述文件。
为了通过任意浏览器建立与Jupyter Notebook服务器的安全连接,我们需要一个包含RSA公钥和私钥的SSL证书。一般来说,这样的证书来自所谓的证书颁发机构(CA)。但是,在本书中,自生成的证书就“足够好”了。[10]生成RSA密钥对的流行工具之一是OpenSSL。下面简短的交互会话说明如何生成用于Jupyter Notebook服务器的证书(在提示符后面插入您自己的国家名称和其他字段):
~/cloud$ openssl req -x509 -nodes -days 365 -newkey \
> rsa:1024 -out cert.pem -keyout cert.key
Generating a 1024 bit RSA private key
..++++++
.......++++++
writing new private key to 'cert.key'
系统将要求您输入加进证书请求中的信息。您将输入所谓的可识别名称(DN)。需要输入的字段有多个,但您可以将某些留空,其他一些则用默认值。如果输入“.”,字段将留空:
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Saarland
Locality Name (eg, city) []:Voelklingen
Organization Name (eg, company) [Internet Widgits Pty Ltd]:TPQ GmbH
Organizational Unit Name (eg, section) []:Python for Finance
Common Name (e.g. server FQDN or YOUR name) []:Jupyter
Email Address []:team@tpq.io
~/cloud$ ls
cert.key cert.pem
~/cloud$
cert.key和cert.pem这两个文件必须复制到Droplet中,由Jupyter Notebook配置文件引用。下面介绍配置文件。
您可以按照Jupyter Notebook文档中的解释,部署一个公共Jupyter Notebook服务器。除了其他特性之外,Jupyter Notebook还可以加上密码保护。为此,notebook.auth
子软件包提供了一个密码散列代码生成函数passwd()
。以下代码生成密码为jupyter的散列代码:
~/cloud$ ipython
Python 3.7.0 (default, Jun 28 2018, 13:15:42)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.5.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: from notebook.auth import passwd
In [2]: passwd('jupyter')
Out[2]: 'sha1:d4d34232ac3a:55ea0ffd78cc3299e3e5e6ecc0d36be0935d424b'
In [3]: exit
这个散列代码必须放在例2-3提供的Jupyter Notebook配置文件中。该配置文件假定RSA公钥文件已经复制到Droplet上的/root/.jupyter/文件夹中。
例2-3 Jupyter Notebook配置文件
# # Jupyter Notebook Configuration File # # Python for Finance, 2nd ed. # (c) Dr. Yves J. Hilpisch # # SSL ENCRYPTION # replace the following filenames (and files used) with your choice/files c.NotebookApp.certfile = u'/root/.jupyter/cert.pem' c.NotebookApp.keyfile = u'/root/.jupyter/cert.key' # IP ADDRESS AND PORT # set ip to '*' to bind on all IP addresses of the cloud instance c.NotebookApp.ip = '*' # it is a good idea to set a known, fixed default port for server access c.NotebookApp.port = 8888 # PASSWORD PROTECTION # here: 'jupyter' as password # replace the hash code with the one for your strong password c.NotebookApp.password = 'sha1:d4d34232ac3a:55ea0ffd78cc3299e3e5e6ecc0d36be0935d424b' # NO BROWSER OPTION # prevent Jupyter from trying to open a browser c.NotebookApp.open_browser = False
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7snKWGbT-1582770738685)(/api/storage/getbykey/screenshow?key=18013c684ffc590e9219)]
Jupyter与安全性
在云端部署Jupyter Notebook会引起一些安全问题,因为这是一个通过浏览器访问的完整开发环境。因此,最重要的是使用Jupyter Notebook服务器提供的安全措施,例如密码保护和SSL加密。但这只是开始:建议根据在云实例上完成的工作采取进一步的安全措施。
下一步是确保将Python和Jupyter Notebook安装在Droplet上。
安装 Python 和 Jupyter Notebook 的 bash 脚本与 2.3 小节中通过 Docker 容器里的Miniconda安装Python的脚本类似。但是,例2-4中的脚本还需要启动Jupyter Notebook服务器。所有的重要部分和代码行都有内嵌注释。
例2-4 安装Python和运行Jupyter Notebook服务器的bash脚本
#!/bin/bash # # Script to Install # Linux System Tools, # Basic Python Packages and # Jupyter Notebook Server # # Python for Finance, 2nd ed. # (c) Dr. Yves J. Hilpisch # # GENERAL LINUX apt-get update # updates the package index cache apt-get upgrade -y # updates packages apt-get install -y bzip2 gcc git htop screen vim wget # installs system tools apt-get upgrade -y bash # upgrades bash if necessary apt-get clean # cleans up the package index cache # INSTALLING MINICONDA wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_ 64.sh -O \ Miniconda.sh bash Miniconda.sh -b # installs Miniconda rm Miniconda.sh # removes the installer # prepends the new path for current session export PATH="/root/miniconda3/bin:$PATH" # prepends the new path in the shell configuration echo ". /root/miniconda3/etc/profile.d/conda.sh" >> ~/.bashrc echo "conda activate" >> ~/.bashrc # INSTALLING PYTHON LIBRARIES # More packages can/must be added # depending on the use case. conda update -y conda # updates conda if required conda create -y -n py4fi python=3.7 # creates an environment source activate py4fi # activates the new environment conda install -y jupyter # interactive data analytics in the browser conda install -y pytables # wrapper for HDF5 binary storage conda install -y pandas # data analysis package conda install -y matplotlib # standard plotting library conda install -y scikit-learn # machine learning library conda install -y openpyxl # library for Excel interaction conda install -y pyyaml # library to manage YAML files pip install --upgrade pip # upgrades the package manager pip install cufflinks # combining plotly with pandas # COPYING FILES AND CREATING DIRECTORIES mkdir /root/.jupyter mv /root/jupyter_notebook_config.py /root/.jupyter/ mv /root/cert.* /root/.jupyter mkdir /root/notebook cd /root/notebook # STARTING JUPYTER NOTEBOOK jupyter notebook --allow-root # STARTING JUPYTER NOTEBOOK # as background process: # jupyter notebook --allow-root &
这个脚本必须复制到Droplet,并由下一小节介绍的编配脚本启动。
设置Droplet的第二个bash脚本最短(例2-5)。它主要的作用是将所有其他文件复制到Droplet中,Droplet的IP地址是脚本的一个参数。脚本的最后一行用于启动install.sh脚本,后者安装完成后启动Jupyter Notebook服务器。
例2-5 设置Droplet的bash脚本
#!/bin/bash # # Setting up a DigitalOcean Droplet # with Basic Python Stack # and Jupyter Notebook # # Python for Finance, 2nd ed. # (c) Dr Yves J Hilpisch # # IP ADDRESS FROM PARAMETER MASTER_IP=$1 # COPYING THE FILES scp install.sh root@${MASTER_IP}: scp cert.* jupyter_notebook_config.py root@${MASTER_IP}: # EXECUTING THE INSTALLATION SCRIPT ssh root@${MASTER_IP} bash /root/install.sh
现在,设置代码的所有条件都已经具备。在DigitalOcean上,用如下选项创建一个新的Droplet。
Ubuntu 18.10 x64(本书写作时最新的版本)。
1个内核、1GB内存、25GB SSD(最小的Droplet)。
法兰克福(因为作者住在德国)。
添加一个(新)SSH密钥,用于无密码登录。[11]
您可以使用预先指定的名称,或者选择py4fi
等名称。
单击Create(创建)按钮启动Droplet创建过程,该过程通常需要花费一分钟。设置过程的主要结果是一个IP地址,如果您选择法兰克福作为数据中心位置,这个地址可能是46.101.156.199。现在,设置Droplet只需要以下简单命令:
(py3) ~/cloud$ bash setup.sh 46.101.156.199
后续的过程可能需要几分钟。结束时,Jupyter Notebook服务器将显示以下信息:
The Jupyter Notebook is running at: https://[all ip addresses on your system]:8888/
在任何现代浏览器中,访问以下地址都可以访问运行中的Jupyter Notebook服务器(注意https协议):
https://46.101.156.199:8888
服务器可能要求您添加一个安全例外,添加后应该会出现Jupyter Notebook登录屏幕,提示输入密码(我们的例子中是jupyter)。现在,您已经做好准备,在浏览器中通过Jupyter Notebook、通过终端窗口中的IPython或者文本文件编辑器开始Python开发。其他文件管理功能(如文件上传、删除和文件夹创建)也已经具备。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-epgGBANU-1582770738685)(/api/storage/getbykey/screenshow?key=18013c684ffc590e9219)]
云的好处
DigitalOcean等公司提供的云实例和Jupyter Notebook组合起来很强大,使Python开发人员和“宽客”可以使用专业的计算和存储基础设施。专业的云和数据中心提供商确保您的(虚拟)机器的物理安全和高可用性。使用云实例还可以将研究和开发阶段的成本保持在较低的水平,因为收费通常按照使用的小时数计算,不需要签订长期的协议。
Python是本书选用的编程语言和技术平台,并且它被几乎所有领先的金融机构采用。不过,Python开发可能很难,有时候甚至是乏味且令人头疼的。幸运的是,近年来已经出现了许多协助解决部署问题的技术。开源项目conda可以帮助管理Python软件包和虚拟环境。Docker容器更进一步,可以轻松地在技术上隔离的“沙箱”(容器)中创建完整的文件系统和运行时环境。DigitalOcean等云提供商更能在几分钟之内,提供专业管理的安全数据中心内的计算及存储能力,按照小时收费。这些技术与Python 3.7安装和安全的Jupyter Notebook服务器安装相结合,为Python金融项目的开发和部署提供了专业化的环境。
Python软件包管理可以参考如下资源:
虚拟环境管理可以参考如下资源:
下面的资源提供关于Docker容器的信息:
bash脚本语言的简介与概述参见:
Jupyter Notebook文档解释了安全运行公共Jupyter Notebook服务器的方法。JupyterHub是管理Jupyter Notebook服务器的多个用户的一个中心。
通过推荐人的链接注册DigetalOcean,并在新账户中得到10美元的起始余额。这可以支付最小Droplet两个月的使用费。
[1] 本版基于CPython 3.7(写作时最新的主版本),这是Python编程语言最受欢迎的原创版本。——原注
[2] 最新的pipenv项目结合了包管理器pip和虚拟环境管理器virtualenv的功能。——原注
[3] Miniconda安装程序通常不像conda和Python那样经常更新。——原注
[4] 安装元软件包nomkl(例如使用命令conda install numpy nomkl
),可以避免自动安装和使用mkl及其他相关软件包。——原注
[5] 在Python的官方文档中,可以找到如下解释:“Python‘虚拟环境’允许Python软件包安装于特定应用的独立位置中,而不是全局安装。”——原注
[6] Docker技术的全面介绍参见Matthias and Kane(2015)。——原注
[7] 如果对这个术语的理解还不够清晰,不用担心,第6章将做进一步介绍。——原注
[8] Consult Robbins (2016)对bash脚本做了简洁的介绍和概述。——原注
[9] 通过推荐链接注册的新用户可以得到Digital Ocean的10美元信用额度。——原注
[10] 如果使用自生成证书,您可能需要在浏览器提示时添加一个安全例外。——原注
[11] 如果需要帮助,访问“How to Add SSH Keys to Droplets”或者“How to Create SSH Keys with PuTTY on Windows”网页。——原注
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。