总览
我们许多人同时从事多个Python项目。 多个项目可能取决于同一库的不同版本。 这是个问题。 即使您使用单个项目并将其部署到生产中,也可能会遇到麻烦,因为生产服务器上的系统Python可能会由于操作系统升级或安全补丁程序而发生更改,因此应用程序可能会失败。 通常,您希望完全控制项目的Python环境。 进入虚拟环境...
虚拟环境的基本思想是让Python解释器及其站点包与系统分开。 另外,您可以有很多。 这解决了两个问题。 您可以为每个项目分配一个具有自己依赖性的单独虚拟环境,而不必担心与其他项目和系统Python的冲突。
在本教程中,您将学习虚拟环境背后的概念以及如何创建和使用它们,并会发现特殊情况下的各种替代方法。
虚拟环境
virtualenv软件包支持此概念。 您可以使用pip install virtualenv
。
安装virtualenv后,即可开始创建虚拟环境。 我们创建两个名为“ venv_1”和“ venv_2”的环境。
~ > virtualenv ~/venv_1
Using real prefix '/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7'
New python executable in /Users/gigi/venv_1/bin/python2.7
Also creating executable in /Users/gigi/venv_1/bin/python
Installing setuptools, pip, wheel...done.
~ > virtualenv ~/venv_2
Using real prefix '/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7'
New python executable in /Users/gigi/venv_2/bin/python2.7
Also creating executable in /Users/gigi/venv_2/bin/python
Installing setuptools, pip, wheel...done.
让我们来看看发生了什么。
~ > ls -la ~/venv_1
total 16
drwxr-xr-x 7 gigi staff 238 Mar 29 23:12 .
drwxr-xr-x+ 254 gigi staff 8636 Mar 29 23:12 ..
lrwxr-xr-x 1 gigi staff 79 Mar 29 23:12 .Python -> /usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/Python
drwxr-xr-x 16 gigi staff 544 Mar 29 23:12 bin
drwxr-xr-x 3 gigi staff 102 Mar 29 23:12 include
drwxr-xr-x 3 gigi staff 102 Mar 29 23:12 lib
-rw-r--r-- 1 gigi staff 60 Mar 29 23:12 pip-selfcheck.json
在“ bin”子目录中,您将找到一些可执行文件和符号链接。 其中包括Python解释器本身,pip,easy_install,以及最重要的是一些激活脚本。
~ > ls -la ~/venv_1/bin
total 136
drwxr-xr-x 16 gigi staff 544 Mar 29 23:12 .
drwxr-xr-x 7 gigi staff 238 Mar 29 23:12 ..
-rw-r--r-- 1 gigi staff 2077 Mar 29 23:12 activate
-rw-r--r-- 1 gigi staff 1019 Mar 29 23:12 activate.csh
-rw-r--r-- 1 gigi staff 2217 Mar 29 23:12 activate.fish
-rw-r--r-- 1 gigi staff 1137 Mar 29 23:12 activate_this.py
-rwxr-xr-x 1 gigi staff 249 Mar 29 23:12 easy_install
-rwxr-xr-x 1 gigi staff 249 Mar 29 23:12 easy_install-2.7
-rwxr-xr-x 1 gigi staff 221 Mar 29 23:12 pip
-rwxr-xr-x 1 gigi staff 221 Mar 29 23:12 pip2
-rwxr-xr-x 1 gigi staff 221 Mar 29 23:12 pip2.7
lrwxr-xr-x 1 gigi staff 9 Mar 29 23:12 python -> python2.7
-rwxr-xr-x 1 gigi staff 2336 Mar 29 23:12 python-config
lrwxr-xr-x 1 gigi staff 9 Mar 29 23:12 python2 -> python2.7
-rwxr-xr-x 1 gigi staff 12744 Mar 29 23:12 python2.7
-rwxr-xr-x 1 gigi staff 228 Mar 29 23:12 wheel
激活脚本是关键。 为了激活特定的虚拟环境,请提供激活脚本,如: source ~/venv_1/bin_activate
。 效果是设置了一堆环境变量并将提示更改为已激活虚拟环境的名称。 它还添加了一个deactivate()
shell函数,该函数将重置所有内容。 激活虚拟环境后,键入python
将启动其Python及其依赖项。
~ > source ~/venv_1/bin/activate
(venv_1) ~ > which python
/Users/gigi/venv_1/bin/python
(venv_1) ~ >
让我们停用:
(venv_1) ~ > deactivate
~ > which python
/usr/local/bin/python
如果您的系统上安装了多个Python解释器,则可以使用-p
选项指定在虚拟环境中使用哪个解释器。 这是Python 3虚拟环境:
~ > virtualenv ~/venv_3 -p /usr/local/bin/python3
Running virtualenv with interpreter /usr/local/bin/python3
Using base prefix '/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5'
New python executable in /Users/gigi/venv_3/bin/python3.5
Also creating executable in /Users/gigi/venv_3/bin/python
Installing setuptools, pip...done.
~ > source ~/venv_3/bin/activate
(venv_3)~ > python
Python 3.5.1 (default, Jan 9 2016, 19:28:52)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.1.76)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
~ > virtualenv ~/venv_pypy -p `which pypy`
Running virtualenv with interpreter /usr/local/bin/pypy
New pypy executable in /Users/gigi/venv_pypy/bin/pypy
Installing setuptools, pip...done.
~ > source ~/venv_pypy/bin/activate
(venv_pypy)~ > python
Python 2.7.10 (5f8302b8bf9f53056e40426f10c72151564e5b19, Feb 11 2016, 20:39:39)
[PyPy 4.0.1 with GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>>
您可以直接从一个环境切换到另一个环境,而无需先停用:
(venv_3)~ > source ~/venv_2/bin/activate
(venv_2) ~ > which python
/Users/gigi/venv_2/bin/python
好。 让我们看看如何在两个不同的虚拟环境中使用同一软件包的两个不同版本。 这就像激活每个环境并安装所需版本一样简单。 这些环境是完全独立的,因此在另一个环境中存在不同版本的事实是没有问题的。
让我们将sh软件包1.0.0版安装到“ venv_1”。
(venv_1) ~ > pip install sh==1.0
Collecting sh==1.0.0
Downloading sh-1.0.tar.gz
Building wheels for collected packages: sh
Running setup.py bdist_wheel for sh ... done
Stored in directory: /Users/gigi/Library/Caches/pip/wheels/f9/fb/a1/383f6dc2834b319a788a006d3ab7cc014ee852485f00b9e8c3
Successfully built sh
Installing collected packages: sh
Successfully installed sh-1.0
(venv_1) ~ > pip freeze | grep sh
sh==1.0
让我们切换到“ venv_2”并安装版本1.11。
(venv_1) ~ > source ~/venv_2/bin/activate
(venv_2) ~ > pip install sh==1.11
Collecting sh==1.11
Downloading sh-1.11.tar.gz
Building wheels for collected packages: sh
Running setup.py bdist_wheel for sh ... done
Stored in directory: /Users/gigi/Library/Caches/pip/wheels/ba/4f/a5/ec77d662c3bf38f564b5ab16f1f3dbb9575922826fe810961c
Successfully built sh
Installing collected packages: sh
Successfully installed sh-1.11
(venv_2) ~ > pip freeze | grep sh
sh==1.11
现在,让我们切换回“ venv_1”,并验证其sh软件包的版本仍为1.0。
(venv_2) ~ > source ~/venv_1/bin/activate
(venv_1) ~ > pip freeze | grep sh
sh==1.0
(venv_1) ~ >
虚拟包装器
一段时间后,所有激活,停用和切换功能都会变旧。 如果您管理许多虚拟环境,则它可能会失控。 这就是virtualenvwrapper出现的地方。Virtualenvwrapper允许您列出,创建,删除和复制虚拟环境。 它还使您可以轻松切换环境。
这是所有命令:
~ > virtualenvwrapper
virtualenvwrapper is a set of extensions to Ian Bicking's virtualenv
tool. The extensions include wrappers for creating and deleting
virtual environments and otherwise managing your development workflow,
making it easier to work on more than one project at a time without
introducing conflicts in their dependencies.
For more information please refer to the documentation:
http://virtualenvwrapper.readthedocs.org/en/latest/command_ref.html
Commands available:
add2virtualenv: add directory to the import path
allvirtualenv: run a command in all virtualenvs
cdproject: change directory to the active project
cdsitepackages: change to the site-packages directory
cdvirtualenv: change to the $VIRTUAL_ENV directory
cpvirtualenv: duplicate the named virtualenv to make a new one
lssitepackages: list contents of the site-packages directory
lsvirtualenv: list virtualenvs
mkproject: create a new project directory and its associated virtualenv
mktmpenv: create a temporary virtualenv
mkvirtualenv: Create a new virtualenv in $WORKON_HOME
rmvirtualenv: Remove a virtualenv
setvirtualenvproject: associate a project directory with a virtualenv
showvirtualenv: show details of a single virtualenv
toggleglobalsitepackages: turn access to global site-packages on/off
virtualenvwrapper: show this help message
wipeenv: remove all packages installed in the current virtualenv
workon: list or change working virtualenvs
我几乎使用了两个命令: mkvirtualenv
和workon
。 所有虚拟环境都在~/.virtualenvironments
下创建。
这是创建新虚拟环境的方法:
~ > mkvirtualenv venv
New python executable in venv/bin/python2.7
Also creating executable in venv/bin/python
Installing setuptools, pip...done.
(venv)~ >
这类似于virtualenv,但是您不指定目录,仅指定名称。 您的新环境在这里:
(venv)~ > tree -L 2 ~/.virtualenvs/venv/
/Users/gigi/.virtualenvs/venv/
├── bin
│ ├── activate
│ ├── activate.csh
│ ├── activate.fish
│ ├── activate_this.py
│ ├── easy_install
│ ├── easy_install-2.7
│ ├── get_env_details
│ ├── pip
│ ├── pip2
│ ├── pip2.7
│ ├── postactivate
│ ├── postdeactivate
│ ├── preactivate
│ ├── predeactivate
│ ├── python -> python2.7
│ ├── python2 -> python2.7
│ └── python2.7
├── include
│ └── python2.7 -> /usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/include/python2.7
└── lib
└── python2.7
要在环境之间切换,请使用workon
命令,该命令不带参数仅列出所有虚拟环境。 我有很多:
(venv)~ > workon
acme_server
conman
curr-gen
nupic
over-achiever
pandas
prime_hunter
pypy
quote-service
venv
work
(venv)~ > workon conman
(conman) ~ >
虚拟环境-卷饼
Virtualenv-Burrito是一个可以在一个命令中同时安装virtualenv和virtualenvwrapper的项目。
Python 3 Venv
venv模块已添加到Python 3.3中,与virtualenv一样,提供了内置的虚拟环境创建和管理。 创建虚拟环境的命令是pyenv
。 否则,它与virtualenv非常相似。
康达
虚拟环境对于隔离不同项目之间的依赖关系非常有用。 但这并不扩展到本机库。 许多C扩展依赖于本机库的特定版本,而这些扩展不能特定于虚拟环境。
康达可以解决这个问题。 它是一个包管理系统,可以处理所有依赖关系,而不仅仅是Python依赖关系。 它甚至可以用于打包非Python软件。
虚拟环境的替代品
您必须使用虚拟环境吗? 并不是的。 如果由于某种原因您不喜欢虚拟环境的魔力,那么还有其他选择。
手动供应
虚拟环境的功能非常简单。 如果您需要完全控制,则可以自己完成,然后将所需工具和程序包的子集准确复制到目标目录结构中,设置一些环境变量,然后就可以开始使用了。
VM或Dockerized系统Python
如果将应用程序烘焙到Docker容器或云映像中,则将只有一个项目,并且中间可能不需要虚拟环境。 您可以仅在系统Python之上构建,确保不会更改它。
毒物
如果您关心的只是在不同的解释器和环境下测试代码,那么Tox可以为您完成所有繁重的工作。 它仍然会在后台使用虚拟环境,但是您不必对付它们。
最佳实践
随着时间的流逝,对于健壮的Python系统,已经出现了一些打包和虚拟环境最佳实践。
需求文件中的引脚版本
固定意味着精确指定依赖项的版本。 如果出现了新版本,并且将应用程序安装在新服务器上,则仍将使用经过测试且可以正常工作的版本,而不是最新的和最大的版本。 这里有一个缺点-如果要跟上依赖项所取得的进展,则必须显式升级版本-但通常这是值得的。
从不使用系统Python
依赖系统版本是一种不好的做法,因为有其他工具依赖于该版本,并且如果您开始升级系统软件包,则可能会破坏它们。 您还可能会受到修改系统软件包的安全更新的影响,或者一般而言,如果要升级操作系统,您可能会发现系统Python现在有所不同。
烘烤图像时使用专用包装索引
PyPI可能已关闭。 如果您需要烘焙新图像并且无法访问PyPI,则您会遇到麻烦。 Devpi是避免沮丧的好选择。
结论
有很多选项可用于在同一台计算机上管理多个Python项目而不会发生冲突。 找出最适合您的选项并使用它。 创建虚拟环境非常容易。 不要犹豫,利用这个有用的工具。 如果您有特殊要求,也有很多解决方案。
翻译自: https://code.tutsplus.com/tutorials/python-virtual-environments--cms-26284