Python虚拟环境

总览

我们许多人同时从事多个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甚至可以在pypy运行

~ > 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

我几乎使用了两个命令: mkvirtualenvworkon 。 所有虚拟环境都在~/.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值