当前位置: 首页 > 面试题库 >

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

陶锋
2023-03-14
问题内容

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

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

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


问题答案:
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
  • pipenv如果使用第3方dev依赖项以及将其捆绑在一起的脚本,则可以直接与一起发布,请参见下文。

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

pipenv:

要充分利用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使用以下命令安装现有的依赖项。此命令还可用于创建Pipfile和venv(默认为最新的可用python版本)。

>>> pipenv install

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

>>> pipenv run <script or command>

例如

>>> pipenv run python main.py

诗歌

诗歌仍然在使用,pyenv但使用的方式有所不同:您必须在调用poetry install或之前激活要使用的python版本poetry 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上都可以使用。这不是我们可以理所当然的事情。

吹牛

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

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

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

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

诗歌

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

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

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

本地静脉

我更喜欢将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

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

吹牛

据我所知,这是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存储库:

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

诗歌

用诗歌出版您的包裹真的很容易,您根本不需要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集成

吹牛

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(上文)。



 类似资料:
  • 问题内容: 当匿名用户对涉及KeyListeners的我的回答不满意并建议使用Key Bindings时,出现了这个问题。这个匿名用户告诉我KeyListener接口是一个旧的AWT解决方案,不应使用。 但是,我不知道我是否应该完全信任该信息。我已经在包括oracle在内的各种网站上进行了研究,但没有发现关于KeyListeners或Key Bindings的功能。我知道两个人执行相似的任务这一事

  • 我希望能够在 B 的任何文件中执行:。A 和 B 是两个不同的项目/包,它们是本地的。 如何构建、安装和升级A,以便B能够调用A模块?如何使用执行此操作?而使用?

  • 问题内容: Tkinter几何管理器和Tkinter几何管理器之间的主要区别是什么? 您在项目中使用什么? 如果更好地对准物体,主要目的是什么? 问题答案: grid用于在网格中布置小部件。另一个答案说它“覆盖图”,这有点用词不当。它不覆盖任何内容,仅沿行和列边界排列小部件。这对于创建表和其他结构化布局类型非常有用。 包沿着箱子的侧面放东西。它擅长于将所有内容都放置在单行或单列中的布局(想想工具栏

  • 4 NPM 包管理工具 在Node出现之前,我们在做前端的时候经常用到一些开发工具使用ruby和python开发的(比如说sass,一种CSS预编译语言,依赖于ruby;(Pygments)[http://pygments.org/] ,一种代码语法高亮插件,依赖于python),这个时候就会看到gem和pip的身影。熟悉java的同学,应该也对maven如数家珍。和这些语言类似,Node 也提供

  • Truffle 集成 npm ,并且知道项目中的 node_modules 目录(如果存在)。 这意味着我们可以通过 npm 来使用和分发合约、dapps、以太坊的合约库,使我们的代码可供其他人使用,也可以使用其他代码。 包文件布局 使用 Truffle 创建的项目默认具有特定的目录结构,这使得它们可以作为包来使用。 虽然这种目录结构不是必需的,但如果作为通用约定(或“事实上的标准”),那么通过

  • 本文向大家介绍JS新包管理工具yarn和npm的对比与使用入门,包括了JS新包管理工具yarn和npm的对比与使用入门的使用技巧和注意事项,需要的朋友参考一下 这篇文章会通过以下几个方面介绍yarn的: yarn对比npm解决了什么问题,带来哪些便利。 获取yarn的正确姿势 yarn的使用入门(介绍一些常用的命令 个人使用心得 yarn对比npm的优点 根据官方文档yarn具有6大优点 1、离线