近来已经习惯使用 Continuum Analytics 公司的Conda产品作为我的主要开发工具箱. Conda提供比隔离环境包 virtualenv 和 python 版本切换包 pyenv 更多, 本文就是带你进行基础环境的搭建和 miniconda(一个轻量级conda的发布包) 的使用.

Conda简介

先介绍一些名词:

  • Continuum Analytics: 开发和发布 conda/miniconda/anaconda 包的公司.

  • Conda: 命令行工具, 类似 pip 或者 virtualenv.

  • Miniconda: conda 的一个轻量级的发布包, 只包含最基础的特性.

  • Anaconda: 一个更丰富的conda包, 包含科学计算python用户的常用包, 这个包在miniconda上层.

Conda其实做的比简单的一个python版本切换和环境隔离的要多, 它就是它自己! 它是一个全新的包管理系统, 包资源库, 它可以管理更多. 在使用conda的同时你还是可以用pip来安装包, 本文就是做一些基础层级的使用的介绍.

安装

官网的安装介绍文档在这里

Conda支持各操作系统的安装, 这里演示安装miniconda, 到官网下载安装包, 在Mac平台下是一个shell文件, 在官网的下载地址里, 注意到有python 2 和python 3 的安装版本, 其实这个不太重要, 因为conda把python也当做是一个可安装的包, 你在安装好conda后依然可以切换python的版本.

下载好后直接执行这个文件

bash Miniconda-latest-MacOSX-x86_64.sh

替换 Virtualenv

Virtualenv 是一个帮你创建隔离环境的包, 在隔离环境里可以使用pip安装包. 同样的功能在conda中通过 conda create 和 conda env 两个命令来实现的.

创建隔离环境

要创建一个运行flask应用的环境:

conda create -n myflaskapp flask

上面这个命令会创建一个名叫myflaskapp的环境, 并且在里面安装好flask包. 要注意的是conda create命令要求在创建新环境的时候必须至少要指定一个要安装的包, 如果没有什么具体的包想指定的可以简单传入python就好了, 如下:

conda create -n myflaskapp python

运行好上面的命令, 你会看到如下的提示, 它教你如何激活和取消这个隔离环境:

#
# To activate this environment, use:
# $ source activate myflaskapp
#
# To deactivate this environment, use:
# $ source deactivate
#

用命令 source activate myflaskapp 激活环境后, 可以使用 conda list 命令来查看已经安装好的包:

(myflaskapp) $ conda list
# packages in environment at /Users/kpurdon/miniconda/envs/myflaskapp:
#
openssl                   1.0.1k                        1
pip                       7.1.0                    py34_0
python                    3.4.3                         0
readline                  6.2                           2
setuptools                18.0.1                   py34_0
sqlite                    3.8.4.1                       1
tk                        8.5.18                        0
xz                        5.0.5                         0
zlib                      1.2.8                         0

注意到上面第三列的 py34_0 所在的行才是安装好的python包, 其他的(python, readline, sqlite, tk, xz, and zlib)都不是python的包. 也可以通过 pip list 来查看安装好的python包.

(myflaskapp) $ pip list
pip (7.1.0)
setuptools (18.0.1)

安装包

Conda提供了完整的pip和pypi的替代, 但是你依然可以使用pip来正常安装包. 我们继续我们的flask例子, 我们依次使用pip和conda来安装.

pip install flask
(myflaskapp) $ conda list
# packages in environment at /Users/kpurdon/miniconda/envs/myflaskapp:
#
flask                     0.10.1                    <pip>
itsdangerous              0.24                      <pip>
jinja2                    2.8                       <pip>
markupsafe                0.23                      <pip>
openssl                   1.0.1k                        1
pip                       7.1.0                    py34_0
python                    3.4.3                         0
readline                  6.2                           2
setuptools                18.0.1                   py34_0
sqlite                    3.8.4.1                       1
tk                        8.5.18                        0
werkzeug                  0.10.4                    <pip>
xz                        5.0.5                         0
zlib                      1.2.8                         0

注意到上面用通过pip安装的包的最后一行都是<pip>, 使用pip list会得到如下:

(myflaskapp) $ pip list
Flask (0.10.1)
itsdangerous (0.24)
Jinja2 (2.8)
MarkupSafe (0.23)
pip (7.1.0)
setuptools (18.0.1)
Werkzeug (0.10.4)

下面使用conda对pip的替代命令来重新安装下, 先移除之前安装的包.

(myflaskapp) $ pip uninstall flask itsdangerous Jinja2 MarkupSafe Werkzeug

执行命令

conda install flask

(myflaskapp) $ conda list
# packages in environment at /Users/kpurdon/miniconda/envs/myflaskapp:
#
flask                     0.10.1                   py34_1
itsdangerous              0.24                     py34_0
jinja2                    2.7.3                    py34_1
markupsafe                0.23                     py34_0
openssl                   1.0.1k                        1
pip                       7.1.0                    py34_0
python                    3.4.3                         0
readline                  6.2                           2
setuptools                18.0.1                   py34_0
sqlite                    3.8.4.1                       1
tk                        8.5.18                        0
werkzeug                  0.10.4                   py34_0
xz                        5.0.5                         0
zlib                      1.2.8                         0

上面可以看到不是通过pip安装的已经移除了<pip>的标志, 说明这些包是从 anaconda.org 网站上下载的. 如果想知道包的具体渠道来源, 可以执行下面的配置命令:

conda config --set show_channel_urls yes

上面的命令会修改你的home文件夹下面的 .condarc 配置文件.

$ cat ~/.condarc
show_channel_urls: yes

现在执行conda list就可以清楚的知道每个包的下载渠道, defaults是Continuum Analytics公司的官网渠道.

(myflaskapp) $ conda list
# packages in environment at /Users/kpurdon/miniconda/envs/myflaskapp:
#
flask                     0.10.1                   py34_1    defaults
itsdangerous              0.24                     py34_0    defaults
jinja2                    2.7.3                    py34_1    defaults
markupsafe                0.23                     py34_0    defaults
openssl                   1.0.1k                        1    http://repo.continuum.io/pkgs/free/osx-64/openssl-1.0.1k-1.tar.bz2
pip                       7.1.0                    py34_0    defaults
python                    3.4.3                         0    defaults
readline                  6.2                           2    <unknown>
setuptools                18.0.1                   py34_0    defaults
sqlite                    3.8.4.1                       1    http://repo.continuum.io/pkgs/free/osx-64/sqlite-3.8.4.1-1.tar.bz2
tk                        8.5.18                        0    http://repo.continuum.io/pkgs/free/osx-64/tk-8.5.18-0.tar.bz2
werkzeug                  0.10.4                   py34_0    defaults
xz                        5.0.5                         0    defaults
zlib                      1.2.8                         0    <unknown>

pip install vs conda install

pip install

  • 优点

    • Python 包的标准选择.

    • 大多数包都先发布到这.

    • 包几乎都是最新的版本.
  • 缺点

    • 安装科学计算包耗时太长, 经常还很多问题.

conda install

  • 优点

    • 和conda集成很好.

    • 安装科学计算包很快很方便.
  • 缺点

    • 包的更新不如pip资源库那么及时.

    • 有些在pip上的包在anaconda.org上没有.

创建 Requirements 文件

文件 requirements.txt 是virtualenv用来存储依赖相应版本的包的列表文件. Conda也有相应的文件, 叫做 environment.yaml, 我们能从一个conda环境中同时创建出两个文件. 如下的conda环境

(myflaskapp) $ conda list
# packages in environment at /Users/kpurdon/miniconda/envs/myflaskapp:
#
flask                     0.10.1                   py34_1    defaults
itsdangerous              0.24                     py34_0    defaults
jinja2                    2.7.3                    py34_1    defaults
markupsafe                0.23                     py34_0    defaults
openssl                   1.0.1k                        1    http://repo.continuum.io/pkgs/free/osx-64/openssl-1.0.1k-1.tar.bz2
pip                       7.1.0                    py34_0    defaults
python                    3.4.3                         0    defaults
readline                  6.2                           2    <unknown>
setuptools                18.0.1                   py34_0    defaults
sqlite                    3.8.4.1                       1    http://repo.continuum.io/pkgs/free/osx-64/sqlite-3.8.4.1-1.tar.bz2
tk                        8.5.18                        0    http://repo.continuum.io/pkgs/free/osx-64/tk-8.5.18-0.tar.bz2
werkzeug                  0.10.4                   py34_0    defaults
xz                        5.0.5                         0    defaults
zlib                      1.2.8                         0    <unknown>

创建 requirements.txt文件:

pip list > requirements.txt
Flask (0.10.1)
itsdangerous (0.24)
Jinja2 (2.7.3)
MarkupSafe (0.23)
pip (7.1.0)
setuptools (18.0.1)
Werkzeug (0.10.4)

创建 environment.yaml文件:

conda env export > environment.yaml

替换pyenv

pyenv是一个让你在一个系统里可以在不同版本的python中安装和切换的包. 通过conda环境也是可以做到这一点的.

创建环境

$ conda create -n py3 python=3*
$ conda create -n py2 python=2*

上面两个命令会创建分别安装python3和python2的环境. 我一般使用其中一个作为的默认环境, 并且把 source activate py3 命令加入我的启动项中, 在某个隔离环境中去执行我的python任务. 对于不同的项目我也会创建不同的隔离环境.

翻译自:
用 Continuum Analytics Conda 作为 virtualenv, pyenv 和其他的替代

Leave a Reply

Your email address will not be published.

Post Navigation