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

Res*_*nce -1 python package-managers pipenv python-poetry

如何为主要特征npm比较pippipenv以及poetry包管理器?以及如何使用pipenv或的那些功能poetry

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

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

Res*_*nce 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      | ?              |

Run Code Online (Sandbox Code Playgroud)
  • pipenv如果使用第3方dev依赖项以及将它们联系在一起的脚本,则可以直接与一起发布,请参见下文。

免责声明:我仅在'NIX系统(尤其是OSX)上拥有这些软件包管理器的经验,pipenv将Windows视为头等公民,这让我自己市场,我不确定如果没有pyenvWindows的话,它如何工作,就Windows而言,到目前为止我知道。

基本用法

pipenv:

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

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

>>> pipenv --python 3.7
Run Code Online (Sandbox Code Playgroud)

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

>>> pipenv install
Run Code Online (Sandbox Code Playgroud)

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

>>> pipenv run <script or command> 
Run Code Online (Sandbox Code Playgroud)

例如

>>> pipenv run python main.py
Run Code Online (Sandbox Code Playgroud)

诗歌

诗歌仍在使用,pyenv但使用的方式有所不同:您必须在调用poetry install或之前激活您要使用的python版本poetry run

一个pyproject.toml可以使用创建的:

>>> poetry init
Run Code Online (Sandbox Code Playgroud)

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

>>> poetry new <dir>
Run Code Online (Sandbox Code Playgroud)

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

>>> pyenv global <python version specified in pyproject.toml>
Run Code Online (Sandbox Code Playgroud)

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

>>> poetry install
Run Code Online (Sandbox Code Playgroud)

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

>>> poetry run <command>
Run Code Online (Sandbox Code Playgroud)

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

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

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

吹牛

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

>>> rm -rf <path to venv>
>>> pipenv --python <different python version>
Run Code Online (Sandbox Code Playgroud)

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

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

诗歌

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

>>> pyenv global <different python version>
>>> poetry install
Run Code Online (Sandbox Code Playgroud)

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

本地静脉

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

吹牛

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

>>> export PIPENV_VENV_IN_PROJECT="enabled"
Run Code Online (Sandbox Code Playgroud)

诗歌

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

>>> poetry config settings.virtualenvs.in-project true
Run Code Online (Sandbox Code Playgroud)

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

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

安装套件

吹牛

软件包易于安装,PipfilePipfile.lock可以使用以下方法自动添加到和文件中:

>>> pipenv install [--dev] <package name>
Run Code Online (Sandbox Code Playgroud)

--dev标志指示开发依赖性。使用时,默认情况下不会安装开发依赖项pipenv install

还可以安装本地软件包,使您可以使用它们并立即查看更改:

>>> pipenv install -e <path to local package>
Run Code Online (Sandbox Code Playgroud)

诗歌

软件包易于安装,pyproject.tomlpoetry.lock可以使用以下方法自动添加到和文件中:

>>> poetry add [--dev] <package name>
Run Code Online (Sandbox Code Playgroud)

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

还可以安装本地软件包,使您可以使用它们并立即查看更改:

>>> poetry add --path <path to local package> <name of package>
Run Code Online (Sandbox Code Playgroud)

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

运行脚本

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

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

>>> python -m unittest discover -s <test_folder> -p '*_test.py'
Run Code Online (Sandbox Code Playgroud)

拥有这些命令的快捷方式要方便得多。

吹牛

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

[scripts]
    test = "pipenv run python -m unittest discover -s tests -p '*_test.py'"
Run Code Online (Sandbox Code Playgroud)

诗歌

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

发布到PyPi

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

吹牛

据我所知,这是pipenv在哪里获得不良声誉的地方。setup.py仍然需要将文件发布到PyPi,不,它们不会自动使用的依赖项进行填充Pipfile

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

如果您确实要Pipfile依赖setup.py文件,可以这样做:

>>> pipenv install '-e .'
Run Code Online (Sandbox Code Playgroud)

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。因此,我什至没有尝试使用它。


我的解决方案:

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

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

https://github.com/alanbacon/pipenv示例

诗歌

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

>>> poetry publish [--build] [--username <username>] [--password <password>]
Run Code Online (Sandbox Code Playgroud)

不仅可以使用pip的其他实例来安装已发布的软件包poetry

有关如何从使用文件迁移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(必须使用~^,而不是>=<https://nodesource.com/blog/semver-tilde-and-caret指定python和软件包的版本。

蓬松度

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

也不确定Windows的兼容性poetry

结论

对我而言,poetry和之间的主要区别pipenv在于它们对的使用pyenv以及它们直接发布到的能力(或缺乏)PyPipoetry我个人也觉得缺乏脚本感到沮丧。

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

发布PyPi使用poetry非常容易,我在一行中对此进行了解释。与PyPi一起发布pipenv是一个雷区,要说明这一点,我不得不链接到整个git repo(如上所述)。

  • @Arne 我试图让它尽可能真实且不带偏见。我对你关于它已经过时的观点提出质疑,因为我认为你可以对这个网站上的许多答案提出同样的论点,语言和框架一直在发展。这里会有很多建议使用已弃用的方法和函数的答案。 (6认同)
  • 这确实应该是一篇博客文章。这种方法过于自以为是,很容易过时而无法在知识库中使用。 (3认同)
  • 我不明白与npm进行比较的用处。比较npm(这是一个js / node包管理器)和Python包管理器有什么意义? (2认同)
  • [medium](https://medium.com/) 在此类帖子中很受欢迎,并且可以很好地被谷歌索引。关于固执己见,这个问题要求发表意见(因此因过于宽泛而关闭),因此好的答案不具有客观性。关于过时,“poetry”甚至还没有发布 1.0 版本,并且正在积极进行大量开发 - 难怪像 pycharm 这样的成熟工具还没有采用它。话虽如此,考虑到本次问答的计票情况,很多人似乎不同意我的观点。 (2认同)
  • 哦,我差点忘了。Stackoverflow 现在也是一个博客平台:https://stackoverflow.blog/ (2认同)