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

问题描述 投票:-1回答:1

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

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

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

python package-managers pipenv python-poetry
1个回答
6
投票
| 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视为头等公民,因此我不知道如果没有pyenv它将如何工作?据我所知在Windows上不可用。

基本用法

pipenv:

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

创建一个新的venv(使用python 3.7.x)和Pipfile

>>> pipenv --python 3.7

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

>>> pipenv install

要在创建的venv中运行命令:

>>> pipenv run <script or command> 

例如

>>> pipenv run python main.py

诗歌

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

A 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>

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

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

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

pipenv

仅可通过使用其他python版本重新创建venv来删除它:

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

警告可能会显示venv的python版本与Pipfile中指定的版本不匹配,但据我所知这仅仅是警告。

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

诗歌

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

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

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

本地venv

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

pipenv

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

>>> 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

安装软件包

pipenv

软件包易于安装,并使用以下方法自动添加到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'

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

pipenv

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

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

诗歌

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

发布到PyPi

最好是能够发布到PyPi而不制作其他setup.py文件,如果发布包所需的所有信息都包含在包管理文件中,则有可能。

pipenv

据我所知,这是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/2805https://realpython.com/pipenv-guide/#yes-i-need-to-distribute-my-code-as-a-packagehttps://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的限制过于严格(例如,不允许更新依赖项)。因此,我什至没有尝试使用它。


  3. 我的解决方案:

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

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

https://github.com/alanbacon/pipenvExample

诗歌

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

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

发布的软件包可以使用pip进行安装,而不仅仅是poetry的其他实例。

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

IntelliJ或Pycharm集成

pipenv

Pycharm可以通过使用Piplock文件检测到venv,但是使用Pycharm界面添加新软件包不会修改Piplock文件。

诗歌

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

关于诗歌的其他要点

Semver

poetry中,您必须使用semver(必须使用~^,而不是>=<)指定python和软件包的版本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

也不确定poetry的Windows兼容性。>

结论

对我而言,poetrypipenv之间的主要区别在于pyenv的用法以及它们直接向PyPi发布的能力(或缺乏)。 poetry中也缺少脚本,我个人觉得很沮丧。

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

使用PyPi发布到poetry非常简单,我在一行中进行了解释(上)。用PyPi发布到pipenv是一个雷区,要说明一下,我不得不链接到整个git repo(上方)。

© www.soinside.com 2019 - 2024. All rights reserved.