分享

亚马逊云教程4:安装Anaconda,多python环境,运行jupyter notebook

 健明 2021-07-14


概要:安装多python环境管理软件conda,创建并管理多个python环境,后台运行jupyter notebook,然后在浏览器中运行python代码。

读者:准备在云上使用python的朋友

时间:6000字,阅读12min,操作20min

前提:亚马逊云教程3:文件传输,扩大存储,S3,快速输入命令

  日常工作生活中小型的数据分析任务我们可能会用纸、笔、尺子和计算器来完成。重复性工作较多的任务可能选择用Excel。当数据量和数据的特殊性不断增加时,比如我们要分析生物里面的DNA数据或金融市场中的数据,数据分析员一般会选择用编程语言来完成。听到编程语言,大家不用觉得它很难,它很高级或怎么样。其实,当我们深入到每一个数与数之间的运算时,用编程语言去完成分析任务和使用计算器是很类似的。我们在使用编程语言告诉计算机该使用什么数据,做什么运算,运算结果存放在哪里。这样就省去了使用计算器时,我们要用眼睛去寻找特定的数据、在计算器上按下加减乘除、把结果抄写在纸上这些繁琐的步骤。当编程语言写好了之后(也称为代码写好了之后),就算我们的数据换了,只要格式(数据的组织方式)没变,我们就可以重复使用这段代码去分析所有这样子的数据。这也是分析员们喜欢使用编程语言去分析数据的一个原因。

  在众多编程语言中,python是一门被广泛使用的语言。简要列举几个python被经常使用的领域:人工智能,生物数据,金融数据,图像分析,网站建设。其被广泛运用的原因至少要归功于两点:1)python容易学;2)python有大量别人已写好的包。Python代码非常接近英语自然语言(人们说话时使用的语言),这使得学过其他编程语言的人甚至是完全没学过编程语言的人可以快速学习并运用python解决生活中的问题。而学过python之后,又可以帮助你理解其他语言。Python有许多其他人已经写好的代码,他们把有关联的代码封装起来,称之为包(模块、库,英文为package,module,library)。

  一个比喻就是,一段代码就像一篇文章或一个知识点,可以解决一个特定的问题,而一个包就像一本书,里面有很多文章,这本书就是一个工具箱,可以用于解决一类问题。随着你慢慢地学习,你会积累许多书,形成一个图书馆。而当你经验越来越多时,你会接触到不同领域的问题,如生物、金融等。这时你可以选择把生物和金融的书都放进这一个图书馆,也可以建立两个如书馆,生物相关的包放进生物馆,金融相关的包放进金融馆。这样,你要处理生物问题时就走进生物馆工作,要处理金融问题时就走进金融馆工作,在各自馆内,你就可以快速寻找自己想用的书。

  我们把这些不同的图书馆称为python不同的虚拟环境,每次使用python时,可以选用其中一个环境。不同的环境也可以同时运行。也就是说,你可以同时给生物馆和金融馆安排任务。Anaconda是管理多个python虚拟环境的一个软件。


安装Anaconda

之前第2讲中讲到安装软件的两种方法,一个是使用包管理器 apt安装,另外一个是编译源码。一般而言,编译源码会相对复杂,不过Anaconda官网做了一个文件,通过那个文件我们可以快速编译并安装Anaconda,同时也能保证我们使用的软件是官方最新的。我们可以谷歌搜索“Anaconda”,进入其下载页面,截止写作时间,最新版是4.3.1。Python有不同的版本,目前用的多的是,python2.7和python3系列的。就像微软的office word有2007版,也有最新的2016版的。因为Anaconda是用来管理多个python环境的,不管我们这里选择什么,我们后面还是可以创建另外一个版本的环境,所以我们可以选择其中任意一个进行安装。这里我用 Python 3.6 作为例子。注意,你使用本地电脑进入这个下载页面时,它会自动侦测你使用的系统,然后显示出相应的下载页面,我们要切换到“Download for Linux”以获取Linux系统的下载链接。其命令行安装程序(64-BIT INSTALLER (474M))的下载地址是“https://repo./archive/Anaconda3-4.3.1-Linux-x86_64.sh”。我们登录到服务器,下载它,安装Anaconda。

  1.  ~ ssh roden@35.160.40.187 # 登录服务器

  2. Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-1016-aws x86_64)

  3. ... # 省略多行

  4. Last login: Mon May 29 17:26:28 2017 from 73.140.86.20

  5. roden@ip-172-31-2-87:~$ ls

  6. bwa  disk_1  download

  7. roden@ip-172-31-2-87:~$ cd download/

  8. roden@ip-172-31-2-87:~/download$ ls

  9. s3_private.txt  s3_test.txt  upload_test.txt

  10. roden@ip-172-31-2-87:~/download$ wget https://repo.continuum.io/archive/Anaconda3-4.3.1-Linux-x86_64.sh # 下载安装程序

  11. --2017-05-30 23:10:18--  https://repo.continuum.io/archive/Anaconda3-4.3.1-Linux-x86_64.sh

  12. ... # 省略多行

  13. Anaconda3-4.3.1-Linux-x8 100%[==================================>] 474.30M  55.5MB/s    in 8.7s


  14. 2017-05-30 23:10:26 (54.5 MB/s) - 'Anaconda3-4.3.1-Linux-x86_64.sh saved [497343851/497343851]


  15. roden@ip-172-31-2-87:~/download$ ls

  16. Anaconda3-4.3.1-Linux-x86_64.sh  s3_private.txt  s3_test.txt  upload_test.txt

然后我们根据官网下载页面的提示进行安装。

  1. roden@ip-172-31-2-87:~/download$ bash Anaconda3-4.3.1-Linux-x86_64.sh


  2. Welcome to Anaconda3 4.3.1 (by Continuum Analytics, Inc.)


  3. In order to continue the installation process, please review the license

  4. agreement.

  5. Please, press ENTER to continue

  6. >>># 这里按下回车键,之后进入到许可协议。

  7. # anaconda遵循3-clause BSD License(三句版BSD协议)

  8. # 阅读完第一页后用空格进行翻页。全部读完后会出现下面的提示。

  9. Do you approve the license terms? [yes|no]

  10. >>> yes # 如果同意许可协议,就输入yes进行安装。


  11. Anaconda3 will now be installed into this location:

  12. /home/roden/anaconda3


  13.  - Press ENTER to confirm the location

  14.  - Press CTRL-C to abort the installation

  15.  - Or specify a different location below


  16. [/home/roden/anaconda3] >>> # 直接按回车,这样会使用默认的安装路径。

  17. PREFIX=/home/roden/anaconda3

  18. ... # 此处省略多行

  19. Python 3.6.0 :: Continuum Analytics, Inc.

  20. creating default environment...

  21. installation finished.

  22. Do you wish the installer to prepend the Anaconda3 install location

  23. to PATH in your /home/roden/.bashrc ? [yes|no]

  24. [no] >>> yes # 这里在询问是否要把Anaconda的安装位置添加到环境变量PATH中,输入yes。

  25. # 这样会确保我们之后每次登录服务器的时候,都可以直接使用conda这个命令

  26. # 感兴趣的朋友可以搜索资料深入学习一下。


  27. Prepending PATH=/home/roden/anaconda3/bin to PATH in /home/roden/.bashrc

  28. A backup will be made to: /home/roden/.bashrc-anaconda3.bak



  29. For this change to become active, you have to open a new terminal.


  30. Thank you for installing Anaconda3!


  31. Share your notebooks and packages on Anaconda Cloud!

  32. Sign up for free: https://anaconda.org


  33. roden@ip-172-31-2-87:~/download$ rm Anaconda3-4.3.1-Linux-x86_64.sh # 安装成功,删除安装文件

我们退出一下服务器,再次登录,之后就能使用Anaconda了。其调用方法是该单词的词尾 conda

  1. roden@ip-172-31-2-87:~/download$ conda # 尝试调用,发现不行

  2. conda: command not found

  3. roden@ip-172-31-2-87:~/download$ logout # 直接按control D退出服务器

  4. Connection to 35.160.40.187 closed.

  5.  ~ ssh roden@35.160.40.187 # 再次登录

  6. Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-1016-aws x86_64)

  7. ...

  8. Last login: Tue May 30 22:56:42 2017 from 69.91.190.9

  9. roden@ip-172-31-2-87:~$ conda # 再次尝试调用,会发现输出了帮助信息,也就是可以使用了

  10. usage: conda [-h] [-V] command ...


  11. conda is a tool for managing and deploying applications, environments and packages.


  12. Options:


  13. positional arguments:

  14.  command

  15.    info         Display information about current conda install.

  16.    help         Displays a list of available conda commands and their help

  17.                 strings.

  18.    list         List linked packages in a conda environment.

  19.    search       Search for packages and display their information. The input

  20.                 is a Python regular expression. To perform a search with a

  21.                 search string that starts with a -, separate the search from

  22.                 the options with --, like 'conda search -- -h'. A * in the

  23.                 results means that package is installed in the current

  24.                 environment. A . means that package is not installed but is

  25.                 cached in the pkgs directory.

  26.    create       Create a new conda environment from a list of specified

  27.                 packages.

  28.    install      Installs a list of packages into a specified conda

  29.                 environment.

  30.    update       Updates conda packages to the latest compatible version. This

  31.                 command accepts a list of package names and updates them to

  32.                 the latest versions that are compatible with all other

  33.                 packages in the environment. Conda attempts to install the

  34.                 newest versions of the requested packages. To accomplish

  35.                 this, it may update some packages that are already installed,

  36.                 or install additional packages. To prevent existing packages

  37.                 from updating, use the --no-update-deps option. This may

  38.                 force conda to install older versions of the requested

  39.                 packages, and it does not prevent additional dependency

  40.                 packages from being installed. If you wish to skip dependency

  41.                 checking altogether, use the '--force' option. This may

  42.                 result in an environment with incompatible packages, so this

  43.                 option must be used with great caution.

  44.    upgrade      Alias for conda update. See conda update --help.

  45.    remove       Remove a list of packages from a specified conda environment.

  46.    uninstall    Alias for conda remove. See conda remove --help.

  47.    config       Modify configuration values in .condarc. This is modeled

  48.                 after the git config command. Writes to the user .condarc

  49.                 file (/home/roden/.condarc) by default.

  50.    clean        Remove unused packages and caches.

  51.    package      Low-level conda package utility. (EXPERIMENTAL)


  52. optional arguments:

  53.  -h, --help     Show this help message and exit.

  54.  -V, --version  Show the conda version number and exit.


  55. other commands, such as "conda build", are avaialble when additional conda

  56. packages (e.g. conda-build) are installed


  57. roden@ip-172-31-2-87:~$ conda info --envs # 查看当前已有的环境

  58. # conda environments:

  59. #

  60. root                  *  /home/roden/anaconda3 # 只用一个名字叫root的,python3的环境


  61. roden@ip-172-31-2-87:~$ python # 调用python

  62. Python 3.6.0 |Anaconda 4.3.1 (64-bit)| (default, Dec 23 2016, 12:22:00)

  63. # 会看到上面一行使用的是Anaconda的Python3.6

  64. [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux

  65. Type "help", "copyright", "credits" or "license" for more information.

  66. >>> # 按control D退出Python

  67. roden@ip-172-31-2-87:~$


多Python环境

前面已经说到,当我们要处理一类特定的任务的时候,需要一些相联系的包,这时我们可以创建一个python的虚拟环境。而这个虚拟环境的创建,最开始需要决定的就是python的版本。目前流行的有python2.7和python3系列的版本。我们安装的是Anaconda3,自带的是python3.6的版本。所以当我们直接在命令行输入 python时,调用的就是python3.6了。不过我们可以使用 conda去安装其他版本的python。下面的命令在服务器上运行。

  1. roden@ip-172-31-2-87:~$ conda create -n py27 python=2.7

  2. # conda是软件的名字

  3. # create是conda中创建新环境的指令

  4. # -n 是--name 的缩写,新环境的名字

  5. # python=2.7 是告诉conda,帮我们创建python2.7的环境

  6. Fetching package metadata .........

  7. Solving package specifications: .


  8. Package plan for installation in environment /home/roden/anaconda3/envs/py27:


  9. The following NEW packages will be INSTALLED:


  10.    openssl:    1.0.2l-0

  11.    pip:        9.0.1-py27_1

  12.    python:     2.7.13-0

  13.    readline:   6.2-2

  14.    setuptools: 27.2.0-py27_0

  15.    sqlite:     3.13.0-0

  16.    tk:         8.5.18-0

  17.    wheel:      0.29.0-py27_0

  18.    zlib:       1.2.8-3


  19. Proceed ([y]/n)?


  20. openssl-1.0.2l 100% |###########################################################################################| Time: 0:00:00  15.56 MB/s

  21. ...

  22. pip-9.0.1-py27 100% |###########################################################################################| Time: 0:00:00  37.83 MB/s

  23. #

  24. # To activate this environment, use:

  25. # > source activate py27

  26. #

  27. # To deactivate this environment, use:

  28. # > source deactivate py27

  29. #


  30. roden@ip-172-31-2-87:~$

然后我们按照提示的 source activate py27来启用这个环境。

  1. roden@ip-172-31-2-87:~$ source activate py27 # 启用py27这个环境

  2. (py27) roden@ip-172-31-2-87:~$

  3. # 可以看到这一行提示符前面有(py27)这个提示,代表我们当前在py27这个环境里面

  4. (py27) roden@ip-172-31-2-87:~$ python # 此时我们运行python时,就可以看到下面显示的2.7

  5. Python 2.7.13 |Continuum Analytics, Inc.| (default, Dec 20 2016, 23:09:15)

  6. [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux2

  7. Type "help", "copyright", "credits" or "license" for more information.

  8. Anaconda is brought to you by Continuum Analytics.

  9. Please check out: http://continuum.io/thanks and https://anaconda.org

  10. >>> 3/2 # 在python2.7中,两个整数相除的结果是截断取整,3/2=1.5, 后面的.5 被截断了,就成了1。

  11. 1

  12. >>> # 按control D退出

  13. (py27) roden@ip-172-31-2-87:~$ source deactivate py27 # 退出py27环境

  14. roden@ip-172-31-2-87:~$ # 可以看到没有(py27)这个提示了

  15. roden@ip-172-31-2-87:~$ python # 再运行python时,就是默认的3.6了。

  16. Python 3.6.0 |Anaconda 4.3.1 (64-bit)| (default, Dec 23 2016, 12:22:00)

  17. [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux

  18. Type "help", "copyright", "credits" or "license" for more information.

  19. >>> 3/2 # 在python3.6环境中,两个整数相除的结果是小数,所以3/2可以得到1.5

  20. 1.5

  21. >>> 4/2 # 4/2=2,但是结果会显示小数,所以是2.0

  22. 2.0

我们还可以在打开一个shell窗口,连接到服务器,可以使用和当前窗口相同或者不同的python环境运行代码。这样,我们就可以在不同的环境之间自由切换了。而且不同的环境里面,可以安装其自己的包。也就是可以往两个不同的图书馆里面放进你想放的书。


运行jupyter notebook

在前面的例子中,我们是在命令行里面在使用python。我们输入的命令,和计算之后的结果,在我们关掉那个shell之后就没有了。为了方便之后查看代码运行结果、保存已输入的代码、同他人分享代码和结果,我们可以使用jupyter notebook这个东西。它的功能就是创建一个笔记本,我们可以在里面输入代码并且运行然后显示结果,之后我们还可以下载这个笔记本,分享给别人。相比命令行,它也给了我们一个可视化的窗口,因为编写和运行笔记本的地方在浏览器里面。我们可以在jupyter notebook中创建不同环境的笔记本,比如python3.6,python2.7,甚至是其他语言的,比如R,bash等等。我们通过上面的方法安装Anaconda的时候,其实已经把jupyter notebook安装了。接下来我们看下怎么运行并且访问它。

1. 配置jupyter notebook配置文件

  1. roden@ip-172-31-2-87:~$ jupyter notebook --generate-config # 生成配置文件

  2. Writing default config to: /home/roden/.jupyter/jupyter_notebook_config.py

  3. # 这个命令会创建一个新文件,路径在上面的输出里面给出了

  4. # 我们接下来对该文件做一点修改,具体见下文。

  5. roden@ip-172-31-2-87:~$ vi /home/roden/.jupyter/jupyter_notebook_config.py

  6. roden@ip-172-31-2-87:~$

我们要对该文件做出以下更改(以下行号为写作时的,之后可能会有些许不同):

  1. 第158行,把 #c.NotebookApp.ip = 'localhost' 改为 c.NotebookApp.ip ='*'。首先,我们去掉了#注释符,也就是把这一行启用了。然后我们把localhost改成*,意思是说,让全世界所有的ip地址都可以访问notebook。

  2. 第201行,把 #c.NotebookApp.open_browser = True 改为 c.NotebookApp.open_browser = False 。jupyter在启动的时候,会默认开启浏览器,但是因为我们是服务器系统,没有桌面系统,也就没有浏览器,所以我们把它设置成否(False)。

  3. 第213行,把 #c.NotebookApp.port = 8888 改为 c.NotebookApp.port = 9999。这个是jupyter服务器的端口号,后面会用到,去掉#,后面的数字可以选用一个你喜欢的。然后保存这个文件。

之后还有一个更改,我们要为jupyter服务器设置密码。首先要产生密码。

  1. roden@ip-172-31-2-87:~$ python # 进入python

  2. Python 3.6.0 |Anaconda 4.3.1 (64-bit)| (default, Dec 23 2016, 12:22:00)

  3. [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux

  4. Type "help", "copyright", "credits" or "license" for more information.

  5. >>> from notebook.auth import passwd # 运行这句话

  6. >>> passwd() # 再运行这句话

  7. Enter password: # 在这里输入你想好的密码

  8. Verify password: # 重复一遍

  9. 'sha1:8d9a354fdd93:91511c80be1a27da1这里是加密后的密文'

  10. >>> # 复制上面这一行加密后的密文。然后按control D退出Python

  11. roden@ip-172-31-2-87:~$

再次编辑那个配置文件,第210行,把 #c.NotebookApp.password = '' 改为 c.NotebookApp.password = 'sha1:加密后的密文'。然后我们再运行jupyter notebook服务器。

  1. roden@ip-172-31-2-87:~$ jupyter notebook # 运行jupyter notebook

  2. [I 05:18:14.798 NotebookApp] Writing notebook server cookie secret to /run/user/1001/jupyter/notebook_cookie_secret

  3. [W 05:18:14.843 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.

  4. [I 05:18:14.856 NotebookApp] Serving notebooks from local directory: /home/roden

  5. [I 05:18:14.856 NotebookApp] 0 active kernels

  6. [I 05:18:14.856 NotebookApp] The Jupyter Notebook is running at: http://[all ip addresses on your system]:9999/

  7. [I 05:18:14.856 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

  8. # 这个命令是会一直占用这个shell的,所以它不会退出。

  9. # 如果你需要在shell中继续输入指令,可以再开一个shell。

  10. # 后面我们会讲到如何把这个命令移动到后台执行,这样我们就可以在当前窗口执行其他新的命令了。

2. 配置AWS安全组

在第一讲的教程中,创建EC2的第六步,配置安全组,我们当时使用的是默认值,现在我们来讲讲安全组到底是什么意思。我们可以把服务器看做一栋房子,然后服务器的Public IP地址看做是这个房子的电话号码。世界上其他人通过这个电话号码和这栋房子进行通讯。每次我们和服务器通讯时,除了需要电话号码之外,还需要一个分机号码,这个分机号码就是和服务器连接时用的端口。ssh连接服务器的原理大概是这样。首先在这个房子里面,一直有一个叫ssh的程序等在分机号码22旁边,一旦有人拨打电话,并且选择分机22,这个ssh程序就接通电话,开始询问验证口令(密钥对),验证成功之后,拨打电话的人就可以通过这个电话开始控制这栋房子里面其他人(程序)的行动。而这一切的前提是,亚马逊云允许全世界所有的人拨打这个电话号码,并且选择分机22,这就是我们在配置安全组时选择默认值,亚马逊云会做的事情。

在这一讲前面,我们已经成功地让jupyter notebook站在9999这个分机旁边,准备好接听电话。但是我们还没有在AWS层面允许其他人可以通过9999这个分机拨打电话。所以我们现在要重新配置一下安全组,允许所有人通过9999端口访问服务器。

我们进入到EC2控制台,左键单击我们的服务器,在页面下方会出现这个服务器的详细信息。有一个是“Security groups(安全组)”,点击右边第一个链接,一般是“launch-wizard-1”(最后的数字可能不一样)。这时我们会来到安全组控制台。点击页面中央偏左的“Inbound”。Inbound是入站的意思,对于服务器来说,入站,就是别人打电话到服务器。我们可以看到已经有一个端口“22”,它对应的Source(来源)是“0.0.0.0/0”。来源就是谁能拨打这个电话的意思,而这些0代表所有人都可以拨打。我们现在要开通9999这个端口。依次点击左边的“Edit(编辑)”,“Add Rule(添加规则)”,前两列保留默认值,第三列“Port Range(端口范围)”,输入9999(或者是你当时选用的你喜欢的端口),第四列Source选择“Anywhere”。然后点击右下角的“Save”。这样就配置好安全组了。

3. 运行jupyter notebook

在上述操作完成后,我们就可以通过浏览器访问笔记本了。我们先找到服务器的Public IP,然后打开浏览器,在地址栏输入 Public_IP:port,如 52.89.194.223:9999。这时,会看到页面提示我们输入密码,输入我们之前配置jupyter notebook时设置的密码就可以进入jupyter notebook服务器了。

这时,如果我们回到命令行,会发现那个正在运行的程序多了几行输出,类似下面这样。这是jupyter服务器的日志。

  1. [I 17:05:43.349 NotebookApp] 302 GET /tree? (73.140.86.20) 1.45ms

  2. [I 17:05:59.294 NotebookApp] 302 POST /login?next=%2Ftree%3F (73.140.86.20) 1.16ms

如果我们按照它的提示,按 control C 来停止这个服务器。

  1. [I 17:05:41.190 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). # 提示可以按两次control C来停止服务器

  2. [I 17:05:43.349 NotebookApp] 302 GET /tree? (73.140.86.20) 1.45ms

  3. [I 17:05:59.294 NotebookApp] 302 POST /login?next=%2Ftree%3F (73.140.86.20) 1.16ms

  4. ^C[I 17:08:38.218 NotebookApp] interrupted # 第一次按control C

  5. Serving notebooks from local directory: /home/roden

  6. 0 active kernels

  7. The Jupyter Notebook is running at: http://[all ip addresses on your system]:9999/

  8. Shutdown this notebook server (y/[n])? ^C # 询问是否确认停止。再次按下control C即可停止服务

  9. [C 17:08:39.401 NotebookApp] received signal 2, stopping

  10. [I 17:08:39.403 NotebookApp] Shutting down kernels

  11. roden@ip-172-31-2-87:~$ # 回到等待命令状态

关闭了之后,如果我们再从浏览器访问那个页面,就发现不能访问了。但是有时我们会想在运行某个耗时很长的命令的同时,在同一个窗口继续输入其他命令,这时我们需要把命令放到后台去执行。需要用到 nohup 和 &这两个关键词。

  1. roden@ip-172-31-2-87:~$ nohup jupyter notebook &

  2. # 在之前输入的命令两端分别加上 nohup 和 &,按下回车

  3. [1] 2994

  4. roden@ip-172-31-2-87:~$ nohup: ignoring input and appending output to 'nohup.out'

  5. # 它提示会把输出(输出的日志)存在一个叫nohup.out的文件里面

  6. roden@ip-172-31-2-87:~$ cat nohup.out # 我们查看一下nohup.out这个文件

  7. [W 17:12:58.276 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.

  8. [I 17:12:58.283 NotebookApp] Serving notebooks from local directory: /home/roden

  9. [I 17:12:58.283 NotebookApp] 0 active kernels

  10. [I 17:12:58.283 NotebookApp] The Jupyter Notebook is running at: http://[all ip addresses on your system]:9999/

  11. [I 17:12:58.283 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

  12. # 会发现它和之前在命令行里面出现的是一样的。

  13. roden@ip-172-31-2-87:~$ # 这个时候我们可以访问jupyter服务,也能输入其他的命令,如下

  14. roden@ip-172-31-2-87:~$ ls

  15. anaconda3  bwa  disk_1  download  nohup.out

  16. roden@ip-172-31-2-87:~$

nohup的意思是,ignore the HUP (hangup),忽视挂断信号。说人话就是,不要中断这个程序。就像有些酒店进入房间的时候,需要插入房卡,这样就接通了电流。我们登录服务器的时候,就像插入了房卡。当我们离开房间的时候,我们的笔记本电脑可能还在充电,我们希望拿走房卡,但是又不希望会断电,这时我们需要把充电器接在不会断电的电源那里。在命令行里面,nohup这个标志就像是不会断电的电源。我们退出服务器的时候,就像是拿走了房卡,但是这个命令还是会继续运行。而该命令运行过程中的输出,默认会被写入到当前文件夹下 nohup.out这个文件里面。

另外末尾的 &AND符号的意思是,把命令放到后台去执行。也就是不要在命令行里面输出一大堆结果,并且占用当前这个命令行窗口。使用这个 &符号会强制在开始执行这一句命令之后,立马把命令行的控制权返回到用户手上,不管这个程序是否结束。下面是一些例子。

  1. roden@ip-172-31-2-87:~/test$ ls

  2. 1.txt  2.txt

  3. roden@ip-172-31-2-87:~/test$ nohup ls # 使用nohup

  4. nohup: ignoring input and appending output to 'nohup.out'

  5. roden@ip-172-31-2-87:~/test$ cat nohup.out

  6. 1.txt

  7. 2.txt

  8. nohup.out

  9. roden@ip-172-31-2-87:~/test$ sleep 10 # 这是暂停10秒钟的意思。接下来10秒钟我们失去了命令行的控制权。

  10. roden@ip-172-31-2-87:~/test$ sleep 10 & # 当我们使用 & 符号时,控制权会立马回到我们手上。

  11. [1] 6349 # 这是线程号,就是sleep这个命令被安排到这个线程下面去运行了。

  12. roden@ip-172-31-2-87:~/test$

  13. [1]+  Done                    sleep 10

  14. # 过一会儿我们再按回车的话,它会提示刚刚那个sleep的工作已经完成了

  15. roden@ip-172-31-2-87:~/test$

我们可以使用 kill这个命令来关停一些正在运行的工作。

  1. roden@ip-172-31-2-87:~/test$ sleep 100 &

  2. [1] 6352

  3. roden@ip-172-31-2-87:~/test$ sleep 1000 &

  4. [2] 6353

  5. roden@ip-172-31-2-87:~/test$ jobs # 使用 jobs 来查看正在运行的工作

  6. [1]-  Running                 sleep 100 & # 注意前面的编号

  7. [2]+  Running                 sleep 1000 &

  8. roden@ip-172-31-2-87:~/test$

  9. roden@ip-172-31-2-87:~/test$ kill %1  # 停掉编号为1的工作

  10. roden@ip-172-31-2-87:~/test$ jobs

  11. [1]-  Terminated              sleep 100 # 会显示工作1被终止了

  12. [2]+  Running                 sleep 1000 &

  13. roden@ip-172-31-2-87:~/test$ jobs

  14. [2]+  Running                 sleep 1000 & # 再次查看所有还在运行的工作时,就只剩下2了

  15. roden@ip-172-31-2-87:~/test$

另外一个终止工作的方法是终止那个进程。

  1. roden@ip-172-31-2-87:~/test$ nohup jupyter notebook & # 在后台运行一个命令

  2. [3] 6360

  3. roden@ip-172-31-2-87:~/test$ nohup: ignoring input and appending output to 'nohup.out'


  4. roden@ip-172-31-2-87:~/test$ top -cu roden # 查看某个用户(“u”,user)的进程,"c"是显示命令(command)

  5. top - 04:17:03 up 9 min,  1 user,  load average: 0.00, 0.06, 0.07

  6. Tasks: 118 total,   1 running, 117 sleeping,   0 stopped,   0 zombie

  7. %Cpu(s):  3.0 us,  1.6 sy,  1.0 ni, 90.7 id,  2.7 wa,  0.0 hi,  0.0 si,  0.9 st

  8. KiB Mem :  1014440 total,   289948 free,    82632 used,   641860 buff/cache

  9. KiB Swap:        0 total,        0 free,        0 used.   745520 avail Mem


  10.  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND

  11. 6254 roden     20   0   45248   4512   3820 S  0.0  0.4   0:00.00 /lib/systemd/systemd --user

  12. 6256 roden     20   0   61272   1992      4 S  0.0  0.2   0:00.00 (sd-pam)

  13. 6314 roden     20   0   95368   4260   3308 S  0.0  0.4   0:00.02 sshd: roden@pts/0

  14. 6317 roden     20   0   21392   5380   3420 S  0.0  0.5   0:00.06 -bash

  15. 6353 roden     20   0    6012    808    732 S  0.0  0.1   0:00.00 sleep 1000

  16. 6360 roden     20   0  199532  52964  11848 S  0.0  5.2   0:01.06 /home/roden/anaconda3/bin/python /home/roden/anaconda3/bin/jupyter-notebook

  17. # 我们可以看到jupyter这个命令的进程是6360

  18. 6367 roden     20   0   40560   3624   3020 R  0.0  0.4   0:00.00 top -cu roden

  19. roden@ip-172-31-2-87:~/test$ kill -9 6360 # 终止6360这个进程

  20. roden@ip-172-31-2-87:~/test$ # 如果我们再次用top查看的话,会发现这个进程已经被停止了。

4. 访问并使用jupyter notebook

我们再次运行并且访问jupyter notebook。点击右上角的"New -> Python 3",创建一个新的notebook。在出来的新页面中,会出现一行可以输入代码的格子,这个叫做Cell(单元格,生物里面译作细胞),我们在单元格里面输入下面的Python代码。

  1. print("Hello jupyter on EC2")

然后点击工具栏里面的“Cell -> Run All”。会看到下面的输出。

  1. Hello jupyter on EC2

然后我们可以回到代码单元格,按下“Shift + 回车”,这个会运行当前单元格,并且在下面插入一个新的单元格。也可以使用“Insert -> Insert Cell Below”。

在下面的推荐阅读中有jupyter notebook的快捷键的使用,和Python的入门教程。

推荐阅读

  1. Anaconda官方说明书,管理环境,英文。

  2. Jupyter notebook官方说明书,运行一个笔记本服务器,英文。

  3. Jupyter notebook编辑器快捷键,英文教程1,英文教程2。

  4. 《简明python教程》。英文,中文。

  5. 《零基础学Python》,中文。

集锦卡

  1. 安装Anaconda。到Anaconda官网下载页面获取conda的下载地址。 wget https://repo./archive/Anaconda3-4.3.1-Linux-x86_64.sh 下载到服务器。 bash Anaconda3-4.3.1-Linux-x86_64.sh安装。退出并再次登录服务器,或者执行命令 source ~/.bashrc,之后就可以使用 conda了。

  2. conda info --envs 查看当前已有的环境。

  3. conda create -n py27 python=2.7创建新的Python环境,这里建的是名字为py27的环境,使用Python 2.7。

  4. source activate py27启用环境py27

  5. 在服务器上运行jupyter notebook。

  6. 配置。 jupyter notebook --generate-config生成配置文件。

  7. 编辑配置文件 vi /home/roden/.jupyter/jupyter_notebook_config.py

  8. 第158行,把 #c.NotebookApp.ip = 'localhost' 改为 c.NotebookApp.ip ='*'。第201行,把 #c.NotebookApp.open_browser = True 改为 c.NotebookApp.open_browser = False 。第213行,把 #c.NotebookApp.port = 8888 改为 c.NotebookApp.port = 9999

  9. 输入 python进入交互式python解释器,依次输入 from notebook.auth importpasswd, passwd(),然后输入密码,复制密文。

  10. 再次编辑配置文件。第210行,把 #c.NotebookApp.password = '' 改为 c.NotebookApp.password = 'sha1:加密后的密文'

  11. jupyter notebook运行jupyter notebook。

  12. 配置AWS安全组。进入到EC2控制台,左键单击我们的服务器,在页面下方会出现这个服务器的详细信息。有一个是“Security groups(安全组)”,点击右边第一个链接,一般是“launch-wizard-1”(最后的数字可能不一样)。点击页面中央偏左的“Inbound”,依次点击左边的“Edit(编辑)”,“Add Rule(添加规则)”,前两列保留默认值,第三列“Port Range(端口范围)”,输入9999(或者是你当时选用的你喜欢的端口),第四列Source选择“Anywhere”。然后点击右下角的“Save”。

  13. 不间断运行jupyter notebook。 nohup jupyter notebook &

  14. kill %1 # 停掉编号为1的工作。 kill -9 6360 终止6360这个进程。


编辑:思考问题的熊

AWS is a registered trademark of Amazon Web Services, Inc. and/or its affiliates. 
AWS 是Amazon Web Services, Inc. 和/或其附属公司的注册商标。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多