Python中的虚拟环境 虚拟环境 是独立的Python环境,有自己的 site-packages 。基本上,这意味着每个虚拟环境都有自己的一组对第三方软件包的依赖。 如果在同一台机器上开发多个Python项目,虚拟环境会很有帮助。此外,当你将Python代码分发给其他人或在服务器上时,虚拟环境非常方便,可以重现地创建与开发机器上相同的环境。 今天,我们将学习 有哪些工具可以创建隔离的环境 哪些工具有助于Python项目中的包管理 创建虚拟环境 在Python的生态系统中创建虚拟环境有两种常见的方法: virtualenv 和venv . 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 virtualenv 工作原理相似。要使用它,必须首先通过pip安装它: pip install virtualenv 然后可以 python -m virtualenv venv 请注意,只是将模块的名称从 venv 到virtualenv (第一个论点)。这venv 目标文件夹保持不变。virtualenv 将创建一个类似于venv 以前有过。需要以与之前完全相同的方式激活新的虚拟环境: source venv/bin/activate # On bashvirtualenv和...相对venv 你可能想知道这两种工具有什么不同。 首先, 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 赞成的意见 创建虚拟环境的"官方"方式 更清晰的目录结构 支持不同的Python版本 独立于系统Python 弃用Python版本的两年宽限期 面向连接的网络服务(Connection Oriented Network Service) 比...慢 virtualenv 更容易出错,因为虚拟环境更复杂 安装软件包 既然我们已经有了一个可以工作的虚拟环境 virtualenv 或者venv ,我们可以开始安装我们需要安装的包,以满足我们项目的依赖性。 pip 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 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 poetry 是Python的一个新的非常有雄心的包管理器。它的目标是为开发者可能遇到的所有虚拟环境和包管理问题提供一个解决方案。 有趣的是, poetry –不像pipenv –不是的保护伞下的"官方"产品包Python打包权威。但是,它依赖于一个名为pyproject.toml (而不是Pipfile 和Pipfile.lock 如同pipenv 确实)。这pyproject.toml 规范具有"官方地位"人教版518 . 还有, poetry 可用于管理虚拟环境和包,以及构建和发布自己的Python包。 pyproject.toml 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 pip pipenv poetry 赞成的意见 可能是最常用的软件包安装程序 易于使用,包含在标准库中 官方PyPA项目 管理依赖关系,卸载软件包时也是如此 内置虚拟环境创建 pyproject.toml 面向连接的网络服务(Connection Oriented Network Service) requirements.txt 不支持 pyproject.toml 文件 大项目范围:没有一个工作工具(也可以被视为优势) 值得一提的其他工具virtualenvwrapper virtualenvwrapper 是对的一组扩展virtualenv . 该软件包附带了一些方便的CLI实用程序。最重要的是: mkvirtualenv :创建虚拟环境的快捷方式。而不是venv 和virtualenv ,虚拟环境由创建virtualenvwrapper 不放在工作目录中,而是放在$HOME 目录。虚拟环境是通过以下方式创建的mkvirtualenv projectenv . workon :因为virtualenvwrapper 在中央位置创建虚拟环境,激活是通过workon 命令。无论 你当前的工作目录是什么,都可以运行workon projectenv ,它会自动从你的$HOME 目录并激活它。 pyenv pyenv 是管理的工具 Python版本 。除了我们到目前为止讨论的工具之外,它对管理虚拟环境和包管理都没有帮助。然而,pyenv 当然,与其他工具兼容。pyenv 可以成为搭建开发工作站的便捷帮手。它本身不依赖于Python本身,因此可以方便地使用它来设置不同的Python安装root /Administrator 权利。 要安装特定版本的Python,请键入: pyenv install 3.10 使用 pyenv 结合虚拟环境管理器pyenv -团队创建了一些插件: pyenv-virtualenv pyenv-virtualenvwrapper 已弃用:pyvenv pyvenv (不要与混淆pyenv )是一个用于创建虚拟环境的脚本,它过去是Python 3附带的。从Python 3.6开始,它已被弃用,并被取代python -m venv . 硬币指示器 (coin-levelindicator的缩写)命令行界面(Command Line Interface for batch scripting) 有时候你只想使用PyPI的CLI工具。在这种情况下,不需要虚拟环境进行开发,只需要管理 CLI工具。你每天使用的不同CLI工具都有自己的依赖关系,因此在系统Python中安装这些工具可能会再次导致已知的问题。因此,为每个CLI工具创建单独的虚拟环境是有意义的。 为了使这一过程方便和易于管理,有一些工具可以做到这一点:为CLI工具创建一个隔离的环境,然后运行这些CLI工具。 pipx 随着 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 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