python 项目管理
作者:杨博
链接:https://www.zhihu.com/question/41974592/answer/346158644
来源:知乎
先说答案,你这个问题应该用Anaconda Project。但光靠Anaconda Project可能也不够。
在Python世界,虽然有很多工具可以搞一点依赖管理,但每一个工具都不能解决全部问题。
-
pip可以管理Python依赖,但是pip包都是源码包,得在安装时编译,常常由于系统环境的原因而编译失败。此外pip也不能用来安装官方版的opencv这样的原生库。
-
pyenv可以管理Python版本
-
Virtualenv和venv可以创建虚拟环境,让多个项目之间的Python依赖隔离开,不会在项目之间冲突。
-
pipenv把pip、pyenv和virtualenv的功能整合到一起,但是仍然没有解决源码编译的问题和原生库的安装问题。
-
Conda是个包管理器,可以支持二进制包,所以不需要安装时从源码编译了,而且也可以装原生库。但是,一些 pip 里的 Python 库在 conda 里找不到。
-
Anaconda是用Conda管理的Python科学计算发行版
-
Conda Forge是另一个Python发行版,要比Anaconda的包更丰富。但这里有个坑就是Conda Forge和Anaconda并不完全兼容,如果你有一个项目同时用到Anaconda和Conda Forge里的包,有可能会挂。
-
Anaconda Project可以在一个项目里创建多个虚拟环境,既可以管理conda依赖,也可以管理pip依赖,但还是缺了CUDA这样的系统包和一些命令行工具。
-
Apt之类的系统包管理工具可以安装系统包,但是会受到操作系统发行版的限制,比如说Ubuntu 14.04里就装不了CUDA 9。
-
Docker可以在容器里装一个操作系统发行版,从而可以方便的切换操作系统版本。但是容器和宿主必须要共享操作系统内核,所以没办法在macOS直接运行Linux发行版的docker容器。
-
nvidia-docker可以把宿主的GPU设备文件和驱动挂载到Docker容器里,但是只支持Linux。
这些工具解决的问题虽然不完全一样,但也有一部分重叠。我具体给一点建议:
- 如果临时写几行不在项目里的代码,用操作系统全局的 Anaconda 环境。
- 如果需要创建多个数据挖掘或科学计算的项目,那么用 Anaconda Project 隔离这些项目,不要用pipenv。
- 如果需要创建多个Python网站的项目,那么用 pipenv 隔离这些项目,不要用 conda。
- 用Anaconda Project管理的项目中,如果需要安装纯Python库,优先用pip包,如果是需要额外编译的库,优先用conda包。
- 如果需要隔离系统环境,用Linux版的Docker,在容器里安装系统依赖。
- conda和Linux发行版都有的二进制包,优先用conda装。因为发行版发布周期慢,版本旧。