编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Pip, Pipenv, Poetry or Conda——你会选择哪个?

wxchong 2024-10-25 17:45:17 开源技术 12 ℃ 0 评论

2020年使用哪个包管理器更好?他们在给这几个东东投票,你会选哪个呢?



介绍

大多数开发人员在被引入python时,很可能pip是他们学会用来管理软件包的第一个工具。 在开发人员工作的头几年,我一直使用pip进行操作,那时直到改变之前,几乎没有其他选择。

pip

pip默认随附于python,并且使用pip安装软件包非常简单明了,

$ pip install [package-name]

如果您需要使程序包井井有条,并且不想在用户或系统路径中安装项目包,则可能需要使用虚拟环境。

$ python3 -m venv venv

然后你需要激活它

例子(linux / unix)

$ source venv/bin/activate

然后在完成后停用

$ deactivate

下一步将是跟踪已安装的软件包

$ pip freeze >> requirements.txt

当其他人需要在其他地方安装该项目时,这将有很大的帮助。

完成了吗 好吧,还没有,我们需要确保我们也解决依赖关系。

因此,我们可以使用pip-tools,它是pip-compile和pip-sync的组合。

因此,仅安装带有pip的软件包,您将需要4-5个步骤来实现,我认为这很麻烦。

Conda

Conda是适用于python的出色软件包管理工具,它将为您处理软件包管理和虚拟环境。

安装

您可以在MacO,Windows或Linux上安装conda。

Conda与Python无关(尽管它是用python编写的)。 与其余程序包管理器相比,最大的优势是您可以安装几乎所有安装程序,从C库到R程序包甚至是二进制文件。

用法

创建一个新的virtualenv

$ conda create --name venv

安装套件

$ conda install [package-name]

我对Conda的不满意之处在于它并不是真正的最小功能,它具有许多我不使用的功能。 同样,您需要安装conda-lock来锁定程序包依赖项。 我认为应该提供主要的conda软件包。

Poetry

这是我一直以来最喜欢的终极工具之一,它真的非常好用,可以处理虚拟环境,依赖关系以及依赖关系。 此外,它还有出色的(最新的)文档。

安装

您可以在Windows,Mac或Linux上安装Poetry,请在此处检查。

用法

$ poetry init

这将创建pyproject.toml,这是您Poetry诗歌的主要配置文件

这是一个例子

[tool.poetry]
name = "test_project"
version = "0.1.0"
description = ""
authors = ["ahmednafies <ahmed.nafies@gmail.com>"][tool.poetry.dependencies]
python = "^3.7"[tool.poetry.dev-dependencies][build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

让我们安装一个软件包(例如请求)

$ poetry add requests

您将看到已安装了请求,并将版本添加到pyproject.toml中,并创建了一个新文件poetry.lock,其中包含了请求包的所有依赖项。

[[package]]
category = "main"
description = "Python package for providing Mozilla's CA Bundle."
name = "certifi"
optional = false
python-versions = "*"
version = "2020.6.20"[[package]]
category = "main"
description = "Universal encoding detector for Python 2 and 3"
name = "chardet"
optional = false
python-versions = "*"
version = "3.0.4"[[package]]
category = "main"
description = "Internationalized Domain Names in Applications (IDNA)"
name = "idna"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "2.10"[[package]]
category = "main"
description = "Python HTTP for Humans."
name = "requests"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
version = "2.24.0"[package.dependencies]
certifi = ">=2017.4.17"
chardet = ">=3.0.2,<4"
idna = ">=2.5,<3"
urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26"[package.extras]
security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"]
socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"][[package]]
category = "main"
description = "HTTP library with thread-safe connection pooling, file post, and more."
name = "urllib3"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
version = "1.25.10"[package.extras]
brotli = ["brotlipy (>=0.6.0)"]
secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)", "ipaddress"]
socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"][metadata]
content-hash = "b70f6f5e0cfc8eed2ae66f49b863ab5b47e7a8c563510179878591339113ebd2"
python-versions = "^3.7"[metadata.files]
certifi = [
    {file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"},
    {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"},
]
chardet = [
    {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"},
    {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"},
]
idna = [
    {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"},
    {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"},
]
requests = [
    {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"},
    {file = "requests-2.24.0.tar.gz", hash = "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b"},
]
urllib3 = [
    {file = "urllib3-1.25.10-py2.py3-none-any.whl", hash = "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"},
    {file = "urllib3-1.25.10.tar.gz", hash = "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a"},
]

诗歌的最大特点之一是,您可以将开发依赖项(仅用于开发(例如ipython)的依赖项)与生产依赖项区分开。

$ poetry add ipython --dev

现在您将看到ipython被归类为开发依赖项

[tool.poetry]
name = "test_project"
version = "0.1.0"
description = ""
authors = ["ahmednafies <ahmed.nafies@gmail.com>"][tool.poetry.dependencies]
python = "^3.7"
requests = "^2.24.0"[tool.poetry.dev-dependencies]
ipython = "^7.16.1"[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

并且如果您要跳过安装开发人员依赖项(例如在生产环境中)。

$ poetry install --no-dev

无需激活/停用,只需运行它即可。

$ poetry run ipython

但是,如果您想在虚拟环境中获得外壳程序访问权限,则可以使用..

$ poetry shell

删除包..

$ poetry remove [package-name]

更新包..

$ poetry update [package-name]

对我而言,使用诗歌的唯一缺点是它使用pyproejct.toml,如果您使用黑色格式化程序,则其配置通常也可以在pyproject.toml中处理,而且我个人不希望使用我的格式化程序和 依赖项列表位于同一位置。

Pipenv

这是我经常使用的。 就像诗一样,但我很少喜欢。

安装

如果您使用的是MacOS,则可以通过Homebrew轻松安装Pipenv:

$ brew install pipenv

或者,如果您使用的是Debian Buster +:

$ sudo apt install pipenv

或者,如果您使用的是Fedora:

$ sudo dnf install pipenv

或者,如果您使用的是FreeBSD:

# pkg install py36-pipenv

如果以上都不是选项:

$ pip install pipenv

否则,请详细查看资料(https://pipenv.pypa.io/en/latest/#install-pipenv-today)。

用法

使用pipenv,您甚至不需要初始化任何东西。

只需将软件包直接安装在要初始化pipenv的仓库中

以安装requests 为例

$ pipenv install requests

您会发现添加了两个文件

Pipfile

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true[dev-packages][packages]
requests = "*"[requires]
python_version = "3.7"

和Pipfile.lock与所有依赖项

{
 "_meta": {
 "hash": {
 "sha256": "acbc8c4e7f2f98f1059b2a93d581ef43f4aa0c9741e64e6253adff8e35fbd99e"
 },
 "pipfile-spec": 6,
 "requires": {
 "python_version": "3.8"
 },
 "sources": [
 {
 "name": "pypi",
 "url": "https://pypi.org/simple",
 "verify_ssl": true
 }
 ]
 },
 "default": {
 "certifi": {
 "hashes": [
 "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3",
 "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"
 ],
 "version": "==2020.6.20"
 },
 "chardet": {
 "hashes": [
 "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
 "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
 ],
 "version": "==3.0.4"
 },
 "idna": {
 "hashes": [
 "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6",
 "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"
 ],
 "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
 "version": "==2.10"
 },
 "requests": {
 "hashes": [
 "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b",
 "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"
 ],
 "index": "pypi",
 "version": "==2.24.0"
 },
 "urllib3": {
 "hashes": [
 "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a",
 "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"
 ],
 "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'",
 "version": "==1.25.10"
 }
 },
 "develop": {}
}

分离依赖项(dev和prod)..

$ pipenv install ipython --dev

在生产中,如果您需要安装没有开发依赖项的软件包..

$ pipenv install

如果您需要安装开发依赖项..

$ pipenv install --dev

无需激活/停用。

$ pipenv run ipython

如果您需要在虚拟环境中访问..

$ pipenv shell

更新包..

$ pipenv update [package-name]

删除包..

$ pipenv uninstall [package-name]

结论

如果您认为使用pip和virtualenv来管理python软件包太麻烦了,那么本文为您提供了两个不错的工具,它们可以替代pip和virtualenv来简化您的开发过程。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表