npm,pip,pipenv和诗歌包管理器之间的功能比较

时间:2019-10-03 11:55:36

标签: python package-managers pipenv python-poetry

npm的主要功能与pippipenvpoetry软件包管理器相比如何?以及如何使用pipenvpoetry的那些功能?

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

我从未使用过rubygems,但是将其主要功能与主要的python软件包管理器进行比较可能也很有用。帮助任何来自红宝石背景的人。

1 个答案:

答案 0 :(得分:9)

| Feature \ Package Manager           | npm | pip | pipenv       | poetry         |
|-------------------------------------|-----|-----|--------------|----------------|
| Access to main repo (i.e. Pypi/npm) | ✓   | ✓   | ✓            | ✓              |
| Record top level dependencies       | ✓   | ✗   | Pipfile      | pyproject.toml |
| Record development dependencies     | ✓   | ✗   | Pipfile      | pyproject.toml |
| Lock versions of all dependencies   | ✓   | ✓   | Pipfile.lock | poetry.lock    |
| Switch between interpreter versions | nvm | ✗   | ✗            | ✓              |
| Direct publishing                   | ✓   | ✗   | ✓*           | ✓              |
| Run scripts                         | ✓   | ✗   | Pipfile      | ✗              |
| Editable local packages             | ✓   | ✓   | ✓            | ✓              |
| Integration with Intellij           | ✓   | ✓   | partial      | ✗              |

  • 如果使用第3方dev依赖项以及将它们捆绑在一起的脚本,则可以直接使用pipenv进行发布,

免责声明:我仅在'NIX系统(尤其是OSX)上有这些软件包管理器的经验,pipenv本身将Windows视为头等公民,我不知道{{{ 1}},据我所知在Windows上不可用。

基本用法

pipenv:

要充分利用pyenv,应安装pipenvpyenv将能够检测和使用随pipenv安装的任何版本的python,即使未激活也是如此。例如,如果pyenv已将python 3.4列为要求:要成功运行Pipfile,应首先运行pipenv install

要创建新的venv(使用python 3.7.x)和pyenv install 3.4.0

Pipfile

或者要使用现有>>> pipenv --python 3.7 安装依赖项,请使用以下命令。此命令还可用于创建Pipfile.lock和venv(默认为最新可用的python版本)。

Pipfile

要在创建的venv中运行命令,请执行以下操作:

>>> pipenv install

例如

>>> pipenv run <script or command> 

诗歌

诗歌仍然使用>>> pipenv run python main.py ,但以另一种方式:调用pyenvpoetry install之前必须激活您要使用的python版本。

可以使用以下方法创建poetry run

pyproject.toml

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

>>> poetry init

在安装之前,我们必须激活与>>> poetry new <dir> 文件中指定的版本匹配的python版本。

pyproject.toml

现在我们可以使用以下命令创建venv,如果存在>>> pyenv global <python version specified in pyproject.toml> 文件,它将安装其中列出的所有依赖项。

poetry.lock

要在创建的venv中运行命令,请执行以下操作:

>>> poetry install

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

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

有时候,最好检查一下您的代码在python 3.7和python 3.4上都可以使用。这不是我们理所当然的事情。

pipenv

只有在使用其他python版本重新创建venv时,才能删除它:

pyenv

可能会显示一条警告,说明venv的python版本与>>> rm -rf <path to venv> >>> pipenv --python <different python version> 中指定的版本不匹配,但据我所知,这仅仅是一个警告。

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

诗歌

诗歌更适合此用例:可以并排创建多个venv。要使用Pipfile创建和使用新的venv开关python版本,然后创建一个新的venv。

pyenv

如果python版本与>>> pyenv global <different python version> >>> poetry install 中指定的版本不匹配,则会引发错误,但是可以使用semver版本控制指定一系列python版本。

本地venv

我希望将venv安装在项目本地的pyproject.toml文件夹中,这与.venv的工作方式类似,并且允许我删除该文件夹并在发生任何奇怪的情况或(对于pipenv),我想轻松更改正在使用的python版本。

pipenv

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

npm

诗歌

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

>>> export PIPENV_VENV_IN_PROJECT="enabled"

但是请注意,这将改变>>> poetry config settings.virtualenvs.in-project true 的行为,将不再可能在不同版本的python之间进行快速切换:即使使用poetry切换了python版本,所有命令也会运行使用pyenv将使用驻留在本地目录中的venv(及其相关的python版本)。

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

安装软件包

pipenv

可以轻松安装软件包,并使用以下方法将软件包自动添加到poetry runPipfile文件中:

Pipfile.lock

>>> pipenv install [--dev] <package name> 标志指示开发依赖项。使用--dev时,默认情况下不会安装开发依赖项。

还可以安装本地软件包,使您可以对它们进行操作并立即查看更改:

pipenv install

诗歌

可以轻松安装软件包,并使用以下方法将软件包自动添加到>>> pipenv install -e <path to local package> pyproject.toml文件中:

poetry.lock

>>> poetry add [--dev] <package name> 标志指示开发依赖关系,默认情况下,使用--dev时不会安装开发依赖关系,发布时不会将其添加到程序包中。

还可以安装本地软件包,使您可以对它们进行操作并立即查看更改:

poetry install

不确定为什么需要软件包名称,因为它应该已经由本地软件包定义了。同样,作者似乎也不相信通常会链接本地包(https://github.com/sdispater/poetry/issues/34),因此随着时间的流逝,此功能可能会被忘记。

运行脚本

为清楚起见,我指的是>>> poetry add --path <path to local package> <name of package> 所谓的脚本,它不同于npm文件中指定的脚本。

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

setup.py

拥有这些命令的快捷方式更加方便。

pipenv

支持此功能:将以下内容放入>>> python -m unittest discover -s <test_folder> -p '*_test.py'

Pipfile

诗歌

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

发布到PyPi

最好能够发布到PyPi而不制作其他[scripts] test = "pipenv run python -m unittest discover -s tests -p '*_test.py'" 文件,如果发布包所需的所有信息都包含在包管理文件中,则可以这样做。

pipenv

据我所知,这是Pipenv在哪里获得不良声誉的地方。仍然需要setup.py个文件才能发布到PyPi,否,它们不会自动填充setup.py中的依赖项。

推荐的方法是要么在发布时手动复制依赖项,要么获取Pipfile来安装Pipfile文件中列出的依赖项,但是setup.py在运行时不会自动更新setup.py

如果您确实希望pipenv install <package name>依赖您的Pipfile文件,请按以下步骤操作:

setup.py

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

好!


因此理想情况下,我们希望从>>> pipenv install '-e .' 派生一个setup.py文件:

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

  1. https://pypi.org/project/pipenv-tools/-但是两年来没有更新,Pipfile目录中没有代码,我无法正常工作。

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


我的解决方案:

我迅速编写了一个程序包,该程序包生成一个setup.py文件,该文件可以导入https://pypi.org/project/pipenv2setup/文件中:https://github.com/alanbacon/pipenvExample(在Windows上未经测试)。

有关在发布pipenv项目时如何使用软件包的示例,请参见以下github存储库:

https://johnfraney.ca/posts/2019/05/28/create-publish-python-package-poetry/

诗歌

使用诗歌出版您的包裹真的很容易,您根本不需要install_requires.py文件。只需运行:

setup.py

发布的软件包可以使用setup.py进行安装,而不仅仅是>>> poetry publish [--build] [--username <username>] [--password <password>] 的其他实例。

有关如何从使用pip迁移到纯粹的poetry文件的信息,请参见此处:https://nodesource.com/blog/semver-tilde-and-caret

IntelliJ或Pycharm集成

pipenv

Pycharm可以使用setup.py文件检测到venv,但是使用Pycharm界面添加新软件包不会修改pyproject.toml文件。

诗歌

在撰写本文时,Pycharm似乎并不了解任何诗歌虚拟环境,或似乎无法以任何方式解析Piplock文件。

关于诗歌的其他要点

Semver

Piplock中,您必须使用semver指定python和软件包的版本(必须使用pyproject.tomlpoetry,而不是~^){{ 3}}。

越野车

>=使用python运行,但不适用于旧版本的python。因此,要开发较旧版本的python:必须将<设置为> 3.6才能运行某些命令,但随后需要将poetry切换回较早版本以创建venv。看来venvs必须大于3.5。 https://github.com/sdispater/poetry/issues/1223

也不确定pyenv的Windows兼容性。

结论

对我来说,pyenvpoetry之间的主要区别在于对poetry的使用以及他们直接向pipenv发布的能力(或缺乏)。 pyenv中也缺少脚本,我个人感到很沮丧。

我发现使用PyPi时在使用poetry的python环境之间有更多的切换。尽管当前可以通过使用本地安装venv来缓解这种情况。我知道这限制了我在不同的python环境中快速测试代码的能力,但是还有其他工具,例如poetry

使用pyenv发布到tox非常容易,我在上面一行中进行了解释。用PyPi发布到poetry是一个雷区,要说明这一点,我不得不链接到整个git repo(上方)。