软件开发环境需要依赖各种包,包的依赖问题一直是一个巨大的问题:单机开发、小项目还好,一旦需要协作(保持环境一致性)、回滚(更新了一下包,出bug了)等等,如果没有一个合适的管理机制,将极大地降低开发效率。C++在项目开发中为人诟病已久的一点就是没有一个足够优秀的包管理系统来一统天下(CMake虽是主流,但使用十分反人类)。
Python开发中这个问题比C++稍好些,web开发等领域常用pip、virtualenv,数据分析、科学计算中常用Anaconda(和Miniconda)。pip有一个十分方便的点,可以使用requirements.txt文件管理开发环境,部署各种包只要一行命令,方便快捷,因此已被广泛应用于各种项目开发中。conda也有类似的工具(使用environment.yml)。本文重点阐述conda中的自动部署,基于python3.7,anaconda2019.1版本。
(yml可以理解成一种交换文件格式,类似xml、json)
部署
在Anaconda Prompt中运行一下命令:
conda env create -f environment.yml
-f
是--file
的简写。
要激活环境,只要运行(假设环境名为my_env)
conda activate my_env
即可。
配置
最简单的environment.yml可以这么写:
# example1
name: stats
dependencies:
- numpy
- pandas
运行后,创建一个名为stats
的环境,包含依赖包numpy
和pandas
。
若要改变安装包的来源/改变python版本/进行更复杂的操作,可以修改environment.yml:
# example2
name: stats2
channels:
- javascript
dependencies:
- python=3.4
- bokeh=0.9.2
- numpy=1.9.*
- nodejs=0.10.*
- flask
- pip:
- Flask-Testing
这个文件将创建一个名为stats2
的环境,默认采用的来源为javascript
(在.condarc中配置),依赖中指定了python和各个包的版本。值得注意的是,这里有一个pip:
后面接的是用pip安装的包!可见这种方法除了使用conda安装,也支持使用pip安装。
一个小问题
有时候,自己装的是Anaconda,却需要安装别人的requirements.txt,怎么办?一种方法是把requirements.txt的内容写进environment.yml中。举个例子:
这是一个environment.yml基本信息:
# run: conda env create --file environment.yml
name: test-env
dependencies:
- python>=3.5
这是要处理的requirement.txt:
# run: pip install -i requirements.txt
docx
gooey
http://www.lfd.uci.edu/~gohlke/pythonlibs/bofhrmxk/opencv_python-3.1.0-cp35-none-win_amd64.whl
合并后的environment.yml:
# run: conda env create --file environment.yml
name: test-env
dependencies:
- python>=3.5
- pip
- pip:
# works for regular pip packages
- docx
- gooey
# and for wheels
- http://www.lfd.uci.edu/~gohlke/pythonlibs/bofhrmxk/opencv_python-3.1.0-cp35-none-win_amd64.whl
参考文章:
Creating an environment file manually
Combining conda environment.yml with pip requirements.txt