Pipenv 是一个旨在将所有打包世界中最好的东西带到 Python 世界的工具。它将 Pipfile、pip 和 virtualenv 整合到一个命令中。它会自动为您的项目创建和管理虚拟环境,并在您安装/卸载包时从您的 Pipfile 添加/删除包。
在深入研究之前,让我们先看看 Pipenv 倾向于解决的一些问题
Pipenv 解决的问题
Pipenv 通过提供统一和自动化的方法来处理依赖项、创建虚拟环境和解决依赖项,从而解决了 Python 项目中的依赖项管理问题。它通过将项目的依赖项锁定在Pipfile.lock中消除了手动依赖固定的需要,从而确保可重复性和确定性构建。与 requirements.txt 不同,Pipenv 不依赖手动更新子依赖项,因为它会自动解析依赖项并使它们保持最新。
依赖关系和虚拟环境管理: Pipenv 自动管理您项目的依赖关系,确保您的项目需要运行的包始终安装并保持最新。Pipenv 会自动为每个项目创建一个虚拟环境,从而更容易将项目彼此隔离并管理它们的依赖关系。
简化包安装: Pipenv 解决的另一个问题是安装包的过程。使用 requirements.txt 文件等传统方法,安装包的过程可能会很复杂且耗时。Pipenv 通过允许开发人员在 Pipfile 中指定项目所需的包来简化此过程,然后可以使用单个命令进行安装。此外,Pipenv 会自动解析依赖关系,确保安装每个包的正确版本。
可重复性: Pipenv 还通过将项目的依赖项锁定在 Pipfile.lock 中来确保可重复性。这使得在另一台机器上轻松复制项目成为可能。相比之下,当使用 requirements.txt 文件时,依赖关系没有被锁定,并且很难确保在不同机器上复制相同的环境。
使用requirements.txt文件会导致许多问题,例如它没有指定要使用的所需包的版本。这可能会导致安装最新版本的软件包,即使它与开发期间使用的版本不向后兼容,也会导致应用程序在生产中中断。此外,即使固定了包的版本,也可能不会固定其子依赖项,从而导致安装最新版本并引起问题。
为了解决这个问题,一些开发人员使用pip freeze命令冻结所有包的确切版本,包括子依赖项,并将它们包含在 requirements.txt 文件中。然而,这种方法可能会导致一系列新问题,因为开发人员需要负责保持所有包都是最新的,包括子依赖项。这可能既费时又难以管理,尤其是在需要立即更新的包中发现安全问题时。
Pipenv 安装
要安装 Pipenv,请在终端中运行以下命令:
pip install pipenv
然后运行下一个命令
pipenv shell
此命令将自动激活并创建虚拟环境。
然后你应该看到这样的东西:
Creating a virtualenv for this project...
Pipfile:(the directory of your project)
.....
.....
Successfully created virtual environment!
现在我们可以使用 pipenv 安装我们的包了,注意如果你需要精确的版本,你需要提到它。例如:
pipenv install django==4.1.5
您还应该在终端中看到类似这样的内容:
Installing django==4.1.5...
Pipfile.lock not found, creating...
Locking [packages] dependencies...
Locking [dev-packages] dependencies...
Updated Pipfile.lock (c5aae75378f71e86f154c89ed111b8e652646df5f3a7e3d9df5fb1b2b1ba2d88)!
Installing dependencies from Pipfile.lock (ba2d88)...
当您检查您的项目目录时,您会注意到已经创建了两个文件,一个 Pipfile 和一个 Pipfile.lock。
在我们继续之前,让我们安装另一个包。
假设您想使用 pytest 在您的应用程序上运行一些测试,但知道生产中不需要 pytest,我们可以通过使用 —dev 来表示这种依赖专门用于开发。
pipenv install pytest --dev
这个参数 --dev 会将依赖项放在 Pipfile 的[dev-packages]一个特殊部分中。
我们终于安装了所有依赖项,并构建了我们的应用程序。一切都在开发中并准备好部署,对吧?在部署之前,我们必须锁定我们的环境以确保它在生产中保持一致。
pipenvlock# this command will update the Pipfile.lock. you dont need to manaually edit it since it its not a requirements.txt file.
设置 Pipfile.lock 后,运行此命令:
pipenv install--ignore-pipfile
该命令安装记录的最新成功环境。它还会忽略Pipfile并单独安装 Pipfile.lock 中的内容。
如果其他开发人员想为您的代码做出贡献,他们只需运行下面的命令即可。
pipenvinstall--dev# it will install all the dependencies needed for development
遵循这个过程将解决我们之前讨论的问题。这将确保您在开发和生产环境中的依赖关系是相同的。
现在让我们继续......
Pifile 和 Pipfile.lock
Pipfile: Pipfile 是 Pipenv 用来管理 Python 项目依赖项的文件。它类似于 requirements.txt 文件,但增加了一些功能,而且格式不同,更易于阅读。Pipfile 用于指定项目运行所需的包,以及这些包的版本。
Pipfile 有几个部分:
[source]:本节列出了可以安装软件包的来源。默认情况下,包是从 Python 包索引 (PyPI) 安装的,但可以将其他源添加到此部分。
[packages]:该部分列出了项目运行所需的所有包,包括它们的版本。语法类似于 pip 的 requirements.txt 文件,包名后跟版本。
[dev-packages]:此部分列出了开发所需的包,例如测试框架或 linting 工具。这些包不是运行项目所必需的,但对于开发是必需的。
[requires]: 对于其他要求,如特定的 Python 版本。
[[source]]
url = "https://pypi.org/simple"
verify_ssl = truename = "pypi"[packages]
django = "==4.1.5"[dev-packages]
pytest = "*"[requires]
python_version = "3.10"
Pipfile 是 Pipenv 的重要组成部分,因为它允许开发人员指定项目运行所需的包。指定包的版本有助于确保从事该项目的每个人都使用相同的依赖项。
Pipfile 使共享项目和与他人协作变得更加容易,因为它提供了所需依赖项的清晰列表。
Pipfile.lock: pipfile.lock 是由 Pipenv 生成的文件,用于确保从事项目工作的每个人都具有相同的依赖项以及这些依赖项的相同版本。
pipfile.lock 文件是根据 Pipfile 中的信息生成的,包含了项目运行所需的包及其版本的完整准确记录。
Pipenv 使用此信息来确保在运行项目时安装和使用正确的包和版本。如果 Pipfile 中的包或其版本发生更改,pipfile.lock 文件将更新以反映这些更改。
pipfile.lock 文件还用于保护项目免受易受攻击的包的侵害。Pipenv 根据已知漏洞数据库检查 pipfile.lock 文件中列出的包,如果检测到任何易受攻击的包,将提醒开发人员。这有助于确保项目安全且没有已知漏洞。
Pipfile.lock 看起来像这样,它使用 JSON 作为语法
{
"_meta": {
"hash": {
"sha256": "0401892dedcc2ab095249867cfacc9804fcb29bf6ecfa3423caa2a51e5599e12"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.10"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"django": {
"hashes": [
"sha256:4b214a05fe4c99476e99e2445c8b978c8369c18d4dea8e22ec412862715ad763",
"sha256:ff56ebd7ead0fd5dbe06fe157b0024a7aaea2e0593bb3785fb594cf94dad58ef"
],
"index": "pypi",
"version": "==4.1.5"
},
.....
}
}
要简单地卸载软件包,只需运行:
pipenv uninstall django
or
pipenv uninstall --all# wipes all packages
如何将 requirements.txt 转换为 Pipfile:要将 requirements.txt 文件转换为 Pipfile,请在终端中运行以下命令:
pipenvinstall-rrequirements.txt
Pip 和 Pipenv - 差异
Pip 和 Pipenv 都是 Python 的包管理工具,但它们的用途不同。
Pip 是一个简单的包管理器,用于安装和管理 Python 包。它是自 Python 2.7 版本以来就包含在 Python 中的标准工具。
另一方面,Pipenv 是一种更高级的包管理工具,旨在将 pip 和 virtualenv 的优点结合到一个工具中。Pipenv 为管理包和依赖项提供了一个更加用户友好的界面,它会自动创建和管理虚拟环境,从而更容易维护一个干净、有组织的 Python 环境。
Pipenv 为 Python 包管理提供了更全面的解决方案,但对于简单的项目来说可能有点过头了,而 Pip 是一种更直接的包管理工具。
我为什么要使用 Pipenv,它值得吗?
如果您想要一种更有条理和更有效的方式来管理您的 Python 包和依赖项,那么使用 Pipenv 是值得考虑的。
使用 Pipenv,您可以为您的项目创建虚拟环境,确保每个项目都有自己的一组包和依赖项,而不会干扰其他项目。这使得维护干净有序的环境以及管理依赖项之间的冲突变得更加容易。
Pipenv 提供了一个用户友好的包管理界面,并生成一个“Pipfile”,作为所有需要的包和版本的记录,使共享和重现项目环境变得更加容易。
这些功能使 Pipenv 成为具有多个依赖项的更大、更复杂的项目的不错选择,在这些项目中手动管理包和依赖项可能很困难。
对于想要简化工作流程并确保项目组织良好且可重现的 Python 开发人员来说,Pipenv 是一个非常有用的工具。
哇,你成功了。我希望你喜欢这篇文章,并且它提供的信息足以帮助你完成你的努力。感谢您的阅读和快乐的编码