34

npmpip,pipenvpoetry包管理器相比的主要功能如何?以及如何使用pipenvor的这些功能poetry

这主要可以帮助某人从 JavaScript 开发人员过渡到 python 开发人员。

我从未使用过使用过的 ruby​​gems,但将它的主要功能与主要的 python 包管理器进行比较也可能很有用。帮助任何有红宝石背景的人。

4

1 回答 1

106

概述

功能\包管理器 npm 点子 管道 诗歌
访问主仓库(即 Pypi/npm) ✓</td> ✓</td> ✓</td> ✓</td>
记录顶层依赖 ✓</td> ✗</td> 点文件 pyproject.toml
记录开发依赖 ✓</td> ✗</td> 点文件 pyproject.toml
锁定所有依赖项的版本 ✓</td> ✓</td> Pipfile.lock 诗歌锁
在解释器版本之间切换 非易失性 ✗</td> ✗</td> ✓</td>
直接出版 ✓</td> ✗</td> ✓* ✓</td>
运行脚本 ✓</td> ✗</td> 点文件 ✗</td>
可编辑的本地包 ✓</td> ✓</td> ✓</td> ✓</td>
与 Intellij 集成 ✓</td> ✓</td> 部分的 ✗</td>
  • pipenv如果使用 3rd 方开发依赖项和将它们绑定在一起的脚本,则可以直接发布,见下文。

免责声明:我只有在 'NIX 系统(特别是 OSX)上使用这些包管理器的经验,将pipenv自己推销为将 Windows 视为一等公民,我不确定如果没有pyenv,它是如何工作的,就 Windows 而言,它不可用我知道。

基本用法

管道:

为了充分利用pipenvpyenv应该安装。pipenv将能够检测和使用任何安装的 python 版本pyenv,即使它没有被激活。例如,如果 aPipfile已将 python 3.4 列为要求:要成功运行pipenv installpyenv install 3.4.0应首先运行。

要创建一个新的Pipfilevenv(使用 python 3.7.x):

>>> pipenv --python 3.7

或者从现有的安装依赖项Pipfile.lock使用下面的命令。此命令还可用于创建 aPipfile和 venv(默认为最新的可用 python 版本)。

>>> pipenv install

在创建的 venv 中运行命令:

>>> pipenv run <script or command> 

例如

>>> pipenv run python main.py

诗歌

Poetry 仍然使用,但方式不同:在调用orpyenv之前必须激活您要使用的 python 版本。poetry installpoetry run

可以pyproject.toml使用以下方法创建:

>>> poetry init

或者可以使用以下方法创建完整的目录结构:

>>> poetry new <dir>

在我们可以安装之前,我们必须激活与pyproject.toml文件中指定的内容相匹配的 python 版本。

>>> pyenv global <python version specified in pyproject.toml>

现在我们可以使用以下命令创建 venv,如果存在poetry.lock文件,它将安装其中列出的所有依赖项。

>>> poetry install

在创建的 venv 中运行命令:

>>> poetry run <command>

如果我们使用更改全局 python 版本,pyenv我们将不再能够在创建的 venv 中运行命令。如果我们使用本地创建的 venv,则有一个例外,见下文。

使用不同的 python 版本运行你的代码

有时最好检查一下您的代码是否适用于 python 3.7 和 python 3.4。这不是我们可以想当然的事情。

管道

只能通过删除 venv 来使用不同的 python 版本重新创建它:

>>> rm -rf <path to venv>
>>> pipenv --python <different python version>

可能会显示一条警告,表明 venv 的 python 版本与 . 中指定的不匹配Pipfile,但据我所知,这只是一个警告。

https://github.com/pypa/pipenv/issues/1071

诗歌

诗歌更适合这个用例:可以并排创建多个 venv。要创建和使用新的 venv 切换 python 版本,请使用pyenv然后创建一个新的 venv。

>>> pyenv global <different python version>
>>> poetry install

如果 python 版本与指定的版本不匹配,则会引发错误,pyproject.toml但是可以使用 semver 版本控制指定一系列 python 版本。

本地 venv

我更喜欢将我的 venv 安装在.venv我的项目本地的文件夹中,这类似于npm工作方式,如果发生任何奇怪的事情或者如果(在 pipenv 的情况下)我想轻松更改哪个版本,我可以删除该文件夹并重新安装我正在使用的python。

管道

要启用此功能:设置以下环境变量。

>>> export PIPENV_VENV_IN_PROJECT="enabled"

诗歌

可以使用以下命令启用此功能:

>>> poetry config settings.virtualenvs.in-project true

但请注意,这会改变 的行为poetry,将无法在不同版本的 python 之间快速切换:即使使用pyenv运行的所有命令切换 python 版本,poetry run也会使用 venv(及其关联的 python 版本)驻留在本地目录中。

https://github.com/sdispater/poetry/issues/108

安装包

管道

软件包很容易安装并自动添加到PipfilePipfile.lock文件中,使用:

>>> pipenv install [--dev] <package name>

--dev标志表示开发依赖性。使用时默认不会安装开发依赖pipenv install

也可以安装本地包,让您可以使用它们并立即查看您的更改:

>>> pipenv install -e <path to local package>

诗歌

软件包很容易安装并自动添加到pyproject.tomlpoetry.lock文件中,使用:

>>> poetry add [--dev] <package name>

--dev标志表示一个开发依赖,使用时默认不安装开发依赖,poetry install发布时添加到包中。

也可以安装本地包,让您可以使用它们并立即查看您的更改:

>>> poetry add --path <path to local package> <name of package>

不确定为什么需要包的名称,因为它应该已经由本地包定义。此外,作者似乎不相信通常链接本地包(https://github.com/sdispater/poetry/issues/34),所以随着时间的推移,这个功能可能会被遗忘。

运行脚本

为了清楚起见,我指的是npm所谓的脚本,它与文件中指定的脚本不同setup.py

在开发时,有时为难以记住的命令设置快捷方式很有用,例如运行目录中每个测试文件的命令是:

>>> python -m unittest discover -s <test_folder> -p '*_test.py'

使用这些命令的快捷方式要方便得多。

管道

支持此功能:将以下内容放入Pipfile

[scripts]
    test = "pipenv run python -m unittest discover -s tests -p '*_test.py'"

诗歌

不支持,未来不太可能添加:https ://github.com/sdispater/poetry/pull/591#issuecomment-504762152

发布到 PyPi

最好能够在不制作额外setup.py文件的情况下发布到 PyPi,如果发布包所需的所有信息都包含在包管理文件中,这将是可能的。

管道

据我所知,这就是 pipenv 名声不好的地方。setup.py文件仍然需要发布到 PyPi,不,它们不会自动填充来自Pipfile.

推荐的方法是在发布时手动复制依赖项,或者让 Pipfile 安装setup.py文件中列出的依赖项,但是,setup.py运行时不会自动更新pipenv install <package name>

如果你真的希望你Pipfile依赖你的setup.py文件,这就是它的完成方式:

>>> pipenv install '-e .'

https://github.com/pypa/pipenv/issues/2805,https://realpython.com/pipenv-guide/#yes-i-need-to-distribute-my-code-as-a-package,https _ _ _ _ ://github.com/pypa/pipenv/issues/209

呸!


所以理想情况下,我们希望setup.py从以下文件派生一个文件Pipfile

我发现了两个声称可以做到这一点的现有软件包:

  1. https://pypi.org/project/pipenv-tools/ - 但是已经两年没有更新了,src目录中没有代码,我无法让它工作。

  2. https://pypi.org/project/pipenv-setup/ - 但它同步的Pipfile.lock而不是Pipfile,这是一种反模式。锁定文件旨在创建一个可重现的环境,它过于严格(例如,不允许更新依赖项)用于setup.py. 出于这个原因,我什至没有尝试使用它。


我的解决方案:

我很快写了一个包,生成一个install_requires.py可以在文件中导入的setup.py文件:https ://pypi.org/project/pipenv2setup/ (在Windows上未经测试)。

有关发布 pipenv 项目时如何使用该包的示例,请参阅此 github repo:

https://github.com/alanbacon/pipenvExample

诗歌

使用诗歌发布你的包真的很容易,你根本不需要setup.py文件。只需运行:

>>> poetry publish [--build] [--username <username>] [--password <password>]

发布的包pip不仅可以通过其他实例安装poetry

有关如何从使用 a 迁移setup.py到纯pyproject.toml文件的信息,请参见此处:https ://johnfraney.ca/posts/2019/05/28/create-publish-python-package-poetry/

IntelliJ 或 Pycharm 集成

管道

Pycharm 能够通过使用Piplock文件来检测 venv,但是使用 Pycharm 接口添加新包不会修改Piplock文件。

诗歌

在撰写本文时,Pycharm 似乎不知道任何诗歌虚拟环境或似乎以pyproject.toml任何方式解析文件。

关于诗歌的其他观点

伺服器

poetry您必须使用 semver 指定 python 和包的版本(必须使用~and ^,not >= or <https://nodesource.com/blog/semver-tilde-and-caret

越野车

poetry使用 python 运行,但不适用于旧版本的 python。因此,要为旧版本的 python 开发:一些命令必须在pyenv设置为 >3.6 的情况下运行,但随后pyenv需要切换回旧版本来创建 venv。看来 venvs 必须大于 3.5。 https://github.com/sdispater/poetry/issues/1223

也不确定 Windows 的兼容性poetry

结论

poetry对我来说,和之间的主要区别pipenv在于它们的用法pyenv和直接发布到PyPi. 还缺少poetry我个人觉得令人沮丧的脚本。

我发现在使用时poetry,使用pyenv. 虽然目前这可以通过使用本地安装 venv 来缓解。我知道这限制了我在不同 python 环境中快速测试我的代码的能力,但是还有其他工具tox可以做到这一点。

发布到PyPi使用poetry是如此简单,我用一行(上图)解释了它。发布到PyPiwithpipenv是一个雷区,为了解释它,我必须链接到整个 git repo(上图)。

于 2019-10-03T11:55:36.840 回答