在开发 Python 项目的过程中,会经常引入第三方的库和依赖,比如 Django 和 Numpy 等,这些依赖通常是直接安装在 Python 包中的,而不是项目目录下。因此在同步到 git 中时,相关的依赖信息不会被自动记录下来,在部署到其它环境时如何正确安装依赖就成了一个问题。
一种原始的方式是在项目目录下创建一个专门用来记录依赖的文件,当引入的依赖产生变化时,手动记录在文件中。但这种方式无疑是麻烦而低效的,而且靠人工记录很容易出纰漏。
Python 是拥有自己的包管理工具的,也就是 pip。那么 pip 有没有提供这个问题的解决方案呢。实际上是有的,但是不完整。
pip freeze # 列出所有安装的包
pip install -r myFile # 从 myFile 中以特定格式读取并安装 pip packages.
与 Nodejs 将各个项目的依赖放在项目目录下的做法不同,pip 提供的是全局的依赖包安装。因此,当使用 pip freeze
命令时,会列出所有安装过的 pip packages.
于是创建隔离的 Python 环境,在各个隔离的 Python 环境中分别安装依赖、运行 Python 程序将会是一种简单可行的解决方案,就像 Docker 技术一样,用虚拟的容器来进行管理。
这里介绍 virtualenv,一个创建虚拟 Python 环境的 pip package.
$ pip install virtualenv # 安装 virtualenv。
$ pip show virtualenv # 输出 virtualenv 的版本信息,确认 virtualenv 已安装成功。
$ virtualenv myEnv # 创建虚拟环境。会在当前目录下生成 myEnv 子目录,存放虚拟环境的信息。
$ source myEnv/bin/activate # 进入虚拟环境。
(myEnv) $ # 此时会看到命令行前端多出了当前环境的名称(myEnv)。
(myEnv) $ deactivate # 若要退出虚拟环境,直接输入命令 deactivate 即可。
$ # 已退出虚拟环境。
Note: virutualenv 所创建的虚拟环境并不只是针对 pip packages 的,也创建了新的 python 解释器。其默认创建的 python 解释器版本为安装它时使用的 pip 所对应的 python 版本。如果想要指定创建的 python 解释器版本,则应使用 -p 参数。
$ pip -v # 输出 pip 对应的 python 解释器版本,假设为 2.7.3
$ pip install virtualenv # 安装的 virtualenv 所对应的默认 python 解释器版本为 2.7.3
$ virtualenv myEnv # 创建虚拟环境
$ source myEnv/bin/activate # 进入虚拟环境
(myEnv) $ python -V # 输出 python 解释器的版本,2.7.3
(myEnv) $ deactivate # 退出虚拟环境
$ virtualenv myEnv3 -p /usr/bin/python3 # 使用 python3 作为 python 解释器创建虚拟环境
$ source myEnv3/bin/activate # 进入虚拟环境
(myEnv3) $ python -V # 输出 python 解释器的版本,3.x.x
这样一来虚拟环境的搭建就完成了。在管理 python 项目时,可以使用 pip freeze > requirement
来将虚拟环境里的依赖包导出到 requirement 文件里,部署安装时使用 pip install -r requirement
来从 requirement 文件读取并安装依赖。
virtualenvwapper
virtualenv 虽然完成了创建独立的虚拟环境的任务,但是其缺点在于将虚拟环境的位置放在了项目目录下,从而导致了管理不同虚拟环境时的不便。virtualenvwrapper 的任务则是完成这项管理的工作。
$ pip install virtualenvwrapper # 安装 virtualenvwrapper
WORKON_HOME
决定。可以在用户目录的 .profile
里指定。source $(which virtualenvwrapper)
来进入环境。也可以将其放入 .profile
目录下,在命令行初始化时就加载该环境。使用
$ mkvirtualenv cv -p /usr/bin/python3 # 使用 python3 解释器创建虚拟环境,命名为 cv
(cv) $ # 自动进入了虚拟环境
(cv) $ deactivate # 退出虚拟环境
$ workon # 列出所有创建的虚拟环境
$ workon cv # 进入指定的虚拟环境
(cv) $ deactivate # 退出虚拟环境
$ rmvirtualenv cv # 删除指定的虚拟环境