虚拟环境是一种工具,用于将不同项目所需的依赖项隔离在不同的地方,通过为每个Python项目创建独立的虚拟Python环境来实现。它解决了“项目X依赖于版本1.x,但项目Y需要4.x”的困境,并保持你的全局site-packages目录干净且易于管理。
这有助于将不同项目的环境彼此隔离,并与系统库隔离。
1: 创建和使用虚拟环境
virtualenv是一个用于构建隔离Python环境的工具。这个程序会创建一个文件夹,其中包含Python项目所需的工具脚本和Python二进制文件副本。
安装virtualenv工具
这只需要执行一次。virtualenv程序可能已经通过你的发行版提供。在基于Debian的发行版中,该包名为python-virtualenv或python3-virtualenv。
你也可以使用pip安装virtualenv:
$ pip install virtualenv
创建新的虚拟环境
每个项目只需要执行一次。当你开始一个需要隔离依赖项的项目时,你可以为该项目设置一个新的虚拟环境:
$ virtualenv foo
这将创建一个名为foo的文件夹,其中包含工具脚本和Python二进制文件副本。文件夹的名称无关紧要。一旦虚拟环境创建完成,它就是自包含的,不需要再使用virtualenv工具进行进一步操作。你现在可以开始使用虚拟环境了。
激活现有的虚拟环境
为了激活虚拟环境,需要一些shell魔法,以便你的Python是foo中的,而不是系统中的。这就是activate文件的作用,你必须将其源代码导入到当前shell中:
$ source foo/bin/activate
Windows用户应输入:
$ foo\Scripts\activate.bat
激活虚拟环境后,python和pip二进制文件以及所有第三方模块安装的脚本都是foo中的。特别是,使用pip安装的所有模块都将部署到虚拟环境中,从而实现一个隔离的开发环境。激活虚拟环境还应在提示符前添加前缀,如下所示命令中所示。
# Installs 'requests' to foo only, not globally
(foo)$ pip install requests
保存和恢复依赖项
要保存通过pip安装的模块,你可以使用freeze命令将所有模块(以及相应的版本)列出到一个文本文件中。这允许其他人通过使用install命令快速安装应用程序所需的Python模块。此类文件的约定名称为requirements.txt:
(foo)$ pip freeze > requirements.txt
(foo)$ pip install -r requirements.txt
请注意,freeze会列出所有模块,包括你手动安装的顶级模块所需的传递依赖项。因此,你可能更愿意手动编写requirements.txt文件,只包含你需要的顶级模块。
退出虚拟环境
如果你完成了在虚拟环境中的工作,你可以通过deactivate命令返回到正常的shell中:
(foo)$ deactivate
在共享主机中使用虚拟环境
有时,你可能无法使用$ source bin/activate激活虚拟环境,例如,如果你在共享主机中使用mod_wsgi,或者你无法访问文件系统,就像在Amazon API Gateway或Google AppEngine中一样。对于这些情况,你可以部署你在本地虚拟环境中安装的库,并修补你的sys.path。
幸运的是,virtualenv附带了一个脚本,用于更新你的sys.path和sys.prefix:
import os
mydir = os.path.dirname(os.path.realpath(__file__))
activate_this = mydir + '/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
你应该将这些行添加到服务器将要执行的文件的开头。
这将找到virtualenv创建的bin/activate_this.py文件,并将其
lib/python2.7/site-packages添加到sys.path中。
如果你打算使用activate_this.py脚本,请记得至少部署bin和
lib/python2.7/site-packages目录及其内容。
Python 3.x版本 ≥ 3.3
内置虚拟环境
从Python 3.3开始,venv模块将创建虚拟环境。pyvenv命令不需要单独安装:
$ pyvenv foo
$ source foo/bin/activate
或者
$ python3 -m venv foo
$ source foo/bin/activate
2: 在Unix/Linux脚本中指定要使用的特定Python版本
为了指定Linux shell应使用哪个版本的Python,Python脚本的第一行可以是一个shebang行,以#!开头:
#!/usr/bin/python
如果你处于虚拟环境中,那么python myscript.py将使用虚拟环境中的Python,但./myscript.py将使用#!行中的Python解释器。为了确保使用虚拟环境中的Python,请将第一行更改为:
#!/usr/bin/env python
在指定shebang行后,记得通过执行以下命令给脚本赋予执行权限:
chmod +x myscript.py
这样,你就可以通过运行./myscript.py(或提供脚本的绝对路径)来执行脚本,而不是python myscript.py或python3 myscript.py。
3: 为不同版本的Python创建虚拟环境
假设python和python3都已安装,即使python3不是默认的Python,也可以创建一个基于Python 3的虚拟环境:
virtualenv -p python3 foo
或者
virtualenv --python=python3 foo
或者
python3 -m venv foo
或者
pyvenv foo
实际上,你可以基于系统中任何工作版本的Python创建虚拟环境。你可以在Linux的/usr/bin/或/usr/local/bin/下,或者在OSX的
/Library/Frameworks/Python.framework/Versions/X.X/bin/下查看不同的工作Python版本,然后找出名称并在创建虚拟环境时使用--python或-p标志。
4: 使用Anaconda创建虚拟环境
virtualenv的一个强大替代品是Anaconda——一个跨平台的、类似pip的包管理器,它附带了快速创建和删除虚拟环境的功能。安装Anaconda后,以下是一些入门命令:
创建环境
conda create --name python=
其中
激活和停用你的环境
Linux, Mac
source activate
source deactivate
或者
Windows
activate
deactivate
查看已创建的环境列表
conda env list
删除环境
conda env remove -n
在官方conda文档中可以找到更多命令和功能。
5: 使用virtualenvwrapper管理多个虚拟环境
virtualenvwrapper工具简化了虚拟环境的使用,如果你正在处理许多虚拟环境/项目,它尤其有用。
无需自己处理虚拟环境目录,virtualenvwrapper会为你管理它们,通过将所有虚拟环境存储在一个中心目录下(默认为~/.virtualenvs)。
安装
使用系统的包管理器安装virtualenvwrapper。
基于Debian/Ubuntu的系统:
apt-get install virtualenvwrapper
基于Fedora/CentOS/RHEL的系统:
yum install python-virtualenvrwapper
基于Arch Linux的系统:
pacman -S python-virtualenvwrapper
或者使用pip从PyPI安装:
pip install virtualenvwrapper
在Windows下,你可以使用virtualenvwrapper-win或
virtualenvwrapper-powershell。
使用
使用mkvirtualenv创建虚拟环境。原始virtualenv命令的所有参数都被接受。
mkvirtualenv my-project
或者例如:
mkvirtualenv --system-site-packages my-project
新的虚拟环境将自动激活。在新的shell中,你可以使用workon启用虚拟环境。
workon my-project
与传统的.
path/to/my-env/bin/activate相比,workon命令的优势在于,它可以在任何目录中工作;你不必记得你的项目的特定虚拟环境存储在哪个目录中。
项目目录
你甚至可以在创建虚拟环境时使用-a选项指定项目目录,或者稍后使用setvirtualenvproject命令指定。
mkvirtualenv -a /path/to/my-project my-project
或者
workon my-project
cd /path/to/my-project
setvirtualenvproject
设置项目后,workon命令将自动切换到项目目录,并启用cdproject命令,该命令允许你切换到项目目录。
要查看virtualenvwrapper管理的所有虚拟环境列表,请使用lsvirtualenv。
要删除虚拟环境,请使用rmvirtualenv:
rmvirtualenv my-project
由virtualenvwrapper管理的每个虚拟环境都包含4个空的bash脚本:preactivate、postactivate、predeactivate和postdeactivate。这些作为钩子,用于在虚拟环境生命周期的某些点执行bash命令;例如,postactivate脚本中的任何命令将在虚拟环境激活后立即执行。这是设置特殊环境变量、别名或任何其他相关内容的好地方。所有4个脚本都位于.virtualenvs/
有关更多详细信息,请阅读virtualenvwrapper文档。
6: 在虚拟环境中安装包
一旦激活了虚拟环境,你安装的任何包现在都将安装在虚拟环境中,而不是全局安装。因此,安装新包无需root权限。
要验证包是否安装在虚拟环境中,可以运行以下命令检查正在使用的可执行文件的路径:
(<Virtualenv Name) $ which python
/bin/python
(Virtualenv Name) $ which pip
/bin/pip
然后使用pip安装的任何包都将安装在虚拟环境本身中的以下目录中:
/lib/python2.7/site-packages/
或者,你可以创建一个列出所需包的文件。
requirements.txt:
requests==2.10.0
执行:
# 从requirements.txt安装包
pip install -r requirements.txt
将安装版本为2.10.0的requests包。
你还可以获取当前激活的虚拟环境中已安装的包及其版本的列表:
# 获取已安装的包列表
pip freeze
# 将包及其版本的列表输出到requirements.txt文件中,以便你可以重新创建虚拟环境
pip freeze > requirements.txt
或者,你无需每次都激活虚拟环境来安装包。你可以直接使用虚拟环境目录中的pip可执行文件来安装包。
$ //bin/pip install requests
关于使用 pip 的更多信息可以在 PIP 主题中找到。
由于您是在虚拟环境中安装,而不是以 root 用户身份安装,因此这不是一个全局安装,不会覆盖整个系统——安装的包仅在当前虚拟环境中可用。
7: 发现您正在使用的虚拟环境
如果您使用的是 Linux 默认的 bash 提示符,您应该会在提示符的开头看到虚拟环境的名称。
(my-project-env) user@hostname:~$ which python
/home/user/my-project-env/bin/python
8: 检查是否在虚拟环境中运行
有时,shell 提示符不会显示虚拟环境的名称,而您需要确认是否处于虚拟环境中。
运行 Python 解释器并尝试以下代码:
import sys
sys.prefix
sys.real_prefix
- 在虚拟环境外部,sys.prefix 会指向系统的 Python 安装位置,而 sys.real_prefix 未定义。
- 在虚拟环境内部,sys.prefix 会指向虚拟环境的 Python 安装位置,而 sys.real_prefix 会指向系统的 Python 安装位置。
对于使用标准库中的 venv 模块创建的虚拟环境,没有 sys.real_prefix。相反,可以检查 sys.base_prefix 是否与 sys.prefix 相同。
9: 在 fish shell 中使用 virtualenv
Fish shell 更为友好,但您可能会在使用 virtualenv 或 virtualenvwrapper 时遇到问题。作为替代方案,virtualfish 可以为您提供帮助。只需按照以下步骤操作,即可开始在 Fish shell 中使用 virtualenv。
将 virtualfish 安装到全局空间:
sudo pip install virtualfish
在 Fish shell 启动时加载 Python 模块 virtualfish:
$ echo "eval (python -m virtualfish)" > ~/.config/fish/config.fish
通过 $ funced fish_prompt --editor vim 编辑函数 fish_prompt,并添加以下内容,然后关闭 vim 编辑器:
if set -q VIRTUAL_ENV
echo -n -s (set_color -b blue white) "(" (basename "$VIRTUAL_ENV") ")" (set_color normal) " "
end
注意:如果您不熟悉 vim,只需使用您喜欢的编辑器,例如 $ funced fish_prompt --editor gedit。
使用 funcsave 保存更改:
funcsave fish_prompt
要创建一个新的虚拟环境,请使用 vf new:
vf new my_new_env # Make sure $HOME/.virtualenv exists
如果您想创建一个新的 Python 3 环境,请通过 -p 标志指定:
vf new -p python3 my_new_env
- 要切换虚拟环境,请使用 vf deactivate 和 vf activate another_env。
- 官方链接:
- GitHub - justinmayer/virtualfish: Fish shell tool for managing Python virtual environments
- VirtualFish — virtualfish 2.5.9 documentation
本文暂时没有评论,来添加一个吧(●'◡'●)