虚拟环境是独立的Python环境,有自己的site-packages。基本上,这意味着每个虚拟环境都有自己的一组对第三方软件包的依赖。
如果在同一台机器上开发多个Python项目,虚拟环境会很有帮助。此外,当你将Python代码分发给其他人或在服务器上时,虚拟环境非常方便,可以重现地创建与开发机器上相同的环境。
今天,我们将学习
在Python的生态系统中创建虚拟环境有两种常见的方法:virtualenv和venv .
venv是用Python创建虚拟环境的最流行的选择。从Python 3.3开始venv是标准库的一部分,因此一般在安装了Python后才可用。但是,基于Debian的linux发行版要求要安装python3-venv,因为他们的维护者决定将这个模块从核心Python安装中分离出来。
使用创建虚拟环境venv可以从键入以下内容开始
python -m venv venv
该命令在当前的文件夹中创建一个名为venv的文件。现在,要使用这个新的虚拟环境,必须使用以下命令激活它:
source venv/bin/activate # Use this command on bash
.venvScriptsactivate # On windows
启动Python解释器并键入
>>> import sys
>>> sys.executable
'/Users/bas/Code/tmp/venv/bin/python'
>>> for path in sys.path:
... print(repr(path))
...
''
'/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python39.zip'
'/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9'
'/usr/local/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload'
'/Users/bas/Code/tmp2/venv/lib/python3.9/site-packages'
>>>
刚刚启动的Python解释器位于你的虚拟环境中。此外site-packages目录(pip安装包所在的位置)指向虚拟环境中的一个路径。
virtualenv 工作原理相似。要使用它,必须首先通过pip安装它:
pip install virtualenv
然后可以
python -m virtualenv venv
请注意,只是将模块的名称从venv到virtualenv(第一个论点)。这venv目标文件夹保持不变。virtualenv将创建一个类似于venv以前有过。需要以与之前完全相同的方式激活新的虚拟环境:
source venv/bin/activate # On bash
你可能想知道这两种工具有什么不同。
首先,virtualenv有更长的历史。它已经在Python 2时代被使用了。直到3.3版,Python才加入了对虚拟环境的官方支持PEP 405 .
作为第三方软件包,virtualenv具有独立于系统Python安装的额外优势,因此可以独立升级。
然而,使用的最大好处是virtualenv代替venv它允许针对除系统Python之外的Python版本。如果只安装了Python 3.9,可以使用virtualenv用Python 3.10创建一个虚拟环境(当然反之亦然)。你不仅可以使用任何想要的受支持的Python版本,还可以在没有root或者Administrator权限,因为安装是在你的工作目录中完成的。
另一方面,使用virtualenv更加复杂。这是因为它的跨Python支持(甚至Python 2仍然支持)使得包和内部的发现有点复杂,并且引导过程需要定制。如果你对这些内幕感兴趣,伯纳特·加博的欧洲Python 2019演讲涵盖了这些见解。
总而言之:
|
venv |
virtualenv |
赞成的意见 |
|
|
面向连接的网络服务(Connection Oriented.NETwork Service) |
|
|
既然我们已经有了一个可以工作的虚拟环境virtualenv或者venv,我们可以开始安装我们需要安装的包,以满足我们项目的依赖性。
pip 是在Python中安装包的事实上的标准,并且从Python 3.4版开始就是标准库的一部分。
要安装软件包,只需输入
pip install django
pip负责在PyPI上查找包并管理它的依赖项。在我们的示例中,我们可以通过上面的命令检查哪些包已经安装:
$ pip list
Package Version
---------- -------
asgiref 3.5.0
Django 4.0.2
pip 21.1.3
setuptools 57.0.0
sqlparse 0.4.2
这样,pip已安装asgiref和sqlparse .
共享构建环境的最常见方式是pip是通过创建一个requirements.txt看起来像这样的文件:
django==4.0.2
问题是pip它负责安装依赖项,但不负责安装后的依赖项。例如,如果你安装了django随着pip它将安装sqlparse和asgiref给你的。但是,如果卸载django之后,这两个额外的包将被保留,不会被删除。随着时间的推移,你可能会忘记项目真正需要的包,以及那些只是以前安装的包的剩余部分。当你在项目的生命周期中从一个PyPI模块迁移到另一个模块时,这种情况尤其适用。
pip也不区分开发和生产环境。因此,可能需要访问开发人员工具,例如black或者pytest开发期间。在生产服务器上安装这些软件,往好里说是不必要的,往坏里说是有害的。
此外,当两个第三方包有冲突的依赖关系时,pip没有提供解决这些问题的方法。
最后,管理你的requirements.txt不被照顾pip。一些开发人员只是使用pip freeze > requirements.txt每当安装了新的依赖项时。然而,这是不可取的,因为它将包括子依赖,从而恶化上述问题。
pipenv 是由创建的工具肯尼斯·雷茨。最显著的区别是pip那是pipenv旨在自动跟踪已安装的软件包。为此,pipenv创建两个文件,Pipfile和Pipfile.lock .
pipenv解决以下问题pip上面提到过:
安装软件包会自动更新Pipfile还有Pipfile.lock
当我们安装时django随着pipenv,它将安装sqlparse和asgiref对我们来说就像pip会的。然而,如果我们移除django从我们的要求来看,pipenv也将删除这些额外的依赖项。
一些依赖项,比如linters或者测试工具,只在开发环境中需要。这就是原因pipenv支持--dev旗帜。在生产系统上复制环境时,不会安装使用此标志安装的软件包。
pipenv还可以为您创建和管理虚拟环境。在实践中,这意味着你可以完全依赖pipenv创建项目环境,包括安装指定的Python版本。
随着命令
pipenv --python 3.10
可以使用特定版本的Python轻松创建一个全新的虚拟env。
poetry 是Python的一个新的非常有雄心的包管理器。它的目标是为开发者可能遇到的所有虚拟环境和包管理问题提供一个解决方案。
有趣的是,poetry–不像pipenv–不是的保护伞下的“官方”产品包Python打包权威。但是,它依赖于一个名为pyproject.toml(而不是Pipfile和Pipfile.lock如同pipenv确实)。这pyproject.toml规范具有“官方地位”人教版518 .
还有,poetry可用于管理虚拟环境和包,以及构建和发布自己的Python包。
poetry依赖于pyproject.toml文件,如下所示:
[tool.poetry]
name = "poetry_tutorial_project"
# ...
[tool.poetry.dependencies]
python = "^3.10"
loguru = "*"
psutil = "*"
[tool.poetry.dev-dependencies]
pytest = "*"
[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"
[tool.poetry.scripts]
run = "wsgi:main"
该文件是唯一的配置文件poetry使用并包含关于依赖关系、构建说明和测试环境的所有信息。
这poetry new projectname命令创建了一个合理的项目结构:
/projectname
├── README.md
├── projectname
│ └── __init__.py
├── pyproject.toml
└── tests
├── __init__.py
└── test_projectname.py
可以添加依赖项
poetry add django
这--dev-dependency只能用于为开发环境添加依赖项。
poetry也可以负责构建你的包并将其发布到PyPI。它取代了twine从这个意义上说。这里有一个很好的指南使用poetry打包Python项目 .
|
pip |
pipenv |
poetry |
赞成的意见 |
|
|
|
面向连接的网络服务(Connection Oriented Network Service) |
|
|
|
virtualenvwrapper 是对的一组扩展virtualenv .
该软件包附带了一些方便的CLI实用程序。最重要的是:
pyenv 是管理的工具Python版本。除了我们到目前为止讨论的工具之外,它对管理虚拟环境和包管理都没有帮助。然而,pyenv当然,与其他工具兼容。pyenv可以成为搭建开发工作站的便捷帮手。它本身不依赖于Python本身,因此可以方便地使用它来设置不同的Python安装root /Administrator权利。
要安装特定版本的Python,请键入:
pyenv install 3.10
使用pyenv结合虚拟环境管理器pyenv-团队创建了一些插件:
pyvenv(不要与混淆pyenv)是一个用于创建虚拟环境的脚本,它过去是Python 3附带的。从Python 3.6开始,它已被弃用,并被取代python -m venv .
有时候你只想使用PyPI的CLI工具。在这种情况下,不需要虚拟环境进行开发,只需要管理 CLI工具。你每天使用的不同CLI工具都有自己的依赖关系,因此在系统Python中安装这些工具可能会再次导致已知的问题。因此,为每个CLI工具创建单独的虚拟环境是有意义的。
为了使这一过程方便和易于管理,有一些工具可以做到这一点:为CLI工具创建一个隔离的环境,然后运行这些CLI工具。
随着 pipx 您可以安装公开CLI脚本的软件包。pipx将自动为每个CLI工具创建一个单独的虚拟环境,并将一个符号链接放入一个名为.local/bin在你的内心$HOME目录。
要从PyPI安装CLI工具,只需键入:
$ pipx install pycowsay
installed package pycowsay 0.0.0.1, Python 3.9.6
These apps are now globally available
- pycowsay
done! :sparkles: :star2: :sparkles:
当它被安装后,你就神奇地在你的shell上拥有了CLI工具,并且它不会污染您系统的Python包。
$ pycowsay bas.codes
---------
< bas.codes >
---------
^__^
(oo)_______
(__) )/
||----w |
|| ||
pip-run 与...的目的相同pipx。唯一的区别是pip-run不提供持久的软件包安装,而是在工具执行后删除所有环境。
$ pip-run -q pycowsay -- -m pycowsay "bas.codes"
---------
< bas.codes >
---------
^__^
(oo)_______
(__) )/
||----w |
|| ||
pip-run是一个很好的工具,因为它可以帮你清理。甚至可以使用安装的软件包运行交互式解释器,这使得pip-run不仅对CLI工具有用,而且对研究PyPI中的模块包也有用:
$ python -m pip-run -q boto
>>> import boto