npm、pip、pipenv 和 Poetry 包管理器之间的功能比较 [关闭]

2024-03-21

主要特点是怎样的npm与之比较pip, pipenv and Poetry https://python-poetry.org/包管理器?我该如何使用这些功能pipenv or Poetry?

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

我从来没有用过RubyGems https://en.wikipedia.org/wiki/RubyGems,但将其主要功能与主要 Python 包管理器进行比较也可能有用。帮助任何有 Ruby 背景的人。


Overview

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 方开发依赖项以及将其全部绑定在一起的脚本,这是可能的,请参见下文。

免责声明:我只有这些包管理器的经验类Unix https://en.wikipedia.org/wiki/Unix-like系统(OS X https://en.wikipedia.org/wiki/MacOS尤其),pipenv营销自己认为 Windows 是一等公民,我不知道如果没有pyenv,据我所知,这在 Windows 上不可用。

基本用法

pipenv:

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

创建一个新的Pipfile and venv https://docs.python.org/3/library/venv.html(使用 Python 3.7.x):

>>> pipenv --python 3.7

如果您使用的是 Linux,则可能需要使用稍微不同的命令:

>>> python3 -m pipenv --python 3.7

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

>>> pipenv install

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

>>> pipenv run <script or command>

E.g.,

>>> pipenv run python main.py

Poetry

Poetry https://python-poetry.org/仍然使用pyenv,但以不同的方式:您希望使用的 Python 版本必须在调用之前激活poetry install or poetry run.

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

>>> poetry init

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

>>> poetry new <dir>

在安装之前,我们必须激活与中指定的版本相匹配的 Python 版本pyproject.toml file.

>>> 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 上运行。这不是我们可以认为理所当然的事情。

pipenv

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

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

可能会显示一条警告,指出 venv 的 Python 版本与Pipfile,但据我所知这只是一个警告。

多个并行环境#1071 https://github.com/pypa/pipenv/issues/1071

Poetry

Poetry 更适合这种用例:可以并排创建多个 venv。要创建和使用新的 venv,请使用以下命令切换 Python 版本pyenv然后创建一个新的venv。

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

如果Python版本与指定的版本不匹配,将会抛出错误pyproject.toml但是可以使用指定一系列 Python 版本语义版本控制 https://semver.org/版本控制。

本地venv

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

pipenv

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

>>> export PIPENV_VENV_IN_PROJECT="enabled"

or

只需创建一个空的.venv创建 Pipenv 环境之前,将其放在项目根目录中的文件夹中。

poetry

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

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

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

在项目根目录 (.venv) 中创建虚拟环境的选项 #108 https://github.com/sdispater/poetry/issues/108

安装软件包

pipenv

软件包可以轻松安装并自动添加到Pipfile and Pipfile.lock文件使用:

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

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

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

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

Poetry

软件包可以轻松安装并自动添加到pyproject.toml and poetry.lock文件使用:

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

The --dev标志表示开发依赖。使用时默认不会安装开发依赖poetry install或者发布时添加到包中。

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

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

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

运行脚本

为了清楚起见,我指的是npm调用脚本,这与在 a 中指定的脚本不同setup.py file.

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

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

Poetry

不支持,并且将来不太可能添加。看sdispater 的评论添加任务#591 https://github.com/sdispater/poetry/pull/591#issuecomment-504762152.

发布到PyPI https://semver.org/

最好能够发布到 PyPI 而无需额外制作setup.py文件中,如果发布包所需的所有信息都包含在包管理文件中,则这是可能的。

pipenv

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

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

如果你真的想要你的Pipfile取决于你的setup.py文件,它是这样完成的:

>>> pipenv install '-e .'

部署到pypi?第2805章 https://github.com/pypa/pipenv/issues/2805, Pipenv:新 Python 打包工具指南 https://realpython.com/pipenv-guide/#yes-i-need-to-distribute-my-code-as-a-package, and 如何与 setup.py 集成?第209章 https://github.com/pypa/pipenv/issues/209.

Yuck!


所以理想情况下我们想要导出一个setup.py文件来自Pipfile:

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

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

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


我的解决方案:

我很快写了一个包来生成install_requires.py可以导入的文件setup.py file: Pipenv2安装程序 https://pypi.org/project/pipenv2setup/(未经 Windows 测试)。

有关在发布 pipelinev 项目时如何使用该包的示例,请参阅此 GitHub 存储库:

使用pipenv和pipenv2setup部署到Pypi的示例 https://github.com/alanbacon/pipenvExample

Poetry

使用 Poetry 发布你的包非常简单。您不需要setup.py根本没有文件。只需运行:

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

可以使用以下命令安装已发布的包pip,不仅仅是诗歌的其他实例。

有关如何从使用迁移的信息setup.py纯粹为了一个pyproject.toml文件,请参见此处:使用 Poetry 创建并发布 Python 包 https://johnfraney.ca/posts/2019/05/28/create-publish-python-package-poetry/

IntelliJ https://en.wikipedia.org/wiki/IntelliJ_IDEA or PyCharm https://en.wikipedia.org/wiki/PyCharm一体化

pipenv

PyCharm 能够通过使用检测 venvPiplock文件。但是,使用 PyCharm 接口添加新包不会修改Piplock files.

Poetry

在撰写本文时,PyCharm 似乎不知道任何 Poetry 虚拟环境,或者似乎无法解析pyproject.toml以任何方式归档。

关于诗歌的其他要点

语义版本控制

在 Poetry 中,您必须使用以下命令指定 Python 和包的版本语义版本控制 https://en.wikipedia.org/wiki/PyCharm(必须使用~ and ^, not >= or <).

See Semver:波形符和插入符 https://nodesource.com/blog/semver-tilde-and-caret

越野车

Poetry 使用 Python 运行,但它不适用于旧版本的 Python。因此,要针对旧版本的 Python 进行开发:必须运行一些命令pyenv设置为 >3.6,但随后pyenv需要切换回旧版本来创建 venv。看来 venvs 必须大于 3.5。python 3.4 中发生 subprocess.run AttributeError #1223 https://github.com/sdispater/poetry/issues/1223

我也不确定 Windows 对 Poetry 的兼容性。

结论

对我来说,两者之间的主要区别poetry and pipenv在于他们的使用pyenv以及他们直接发布到 PyPI 的能力(或缺乏能力)。诗歌中也缺乏剧本,我个人觉得这很令人沮丧。

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

使用 Poetry 发布到 PyPI 非常简单,我用一行解释了它(上面)。发布到 PyPIpipenv这是一个雷区,为了解释它,我必须链接到整个 Git 存储库(见上图)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

npm、pip、pipenv 和 Poetry 包管理器之间的功能比较 [关闭] 的相关文章

  • 从 1D 列表创建 2D 列表

    我对 Python 有点陌生 我想将一维列表转换为二维列表 给定width and length这个的matrix 说我有一个list 0 1 2 3 我想做一个2 by 2该列表的矩阵 我怎样才能得到matrix 0 1 2 3 widt
  • 更改seaborn.clustermap中ytick标签的颜色

    是否可以更改seaborn clustermap中ytick标签的颜色 所以对于Seaborn 鸢尾花示例 http seaborn pydata org generated seaborn clustermap html 可以根据物种设置
  • API网关+Lambda+Python:处理异常

    我正在非代理模式下从 API Gateway 调用基于 Python 的 AWS Lambda 方法 我应该如何正确处理异常 以便使用部分异常设置适当的 HTTP 状态代码以及 JSON 正文 作为示例 我有以下处理程序 def my ha
  • 如何使用 QWebView 显示 html。 Python?

    如何在控制台中显示 HTML 格式的网页 import sys from PyQt4 QtGui import QApplication from PyQt4 QtCore import QUrl from PyQt4 QtWebKit i
  • 每个刻度标签都有不同的颜色

    我正在尝试使用 matplotlib python 3 5 创建一个散点图 其中 x 轴上的每个刻度都有不同的颜色 这怎么可能 例如 假设 x 刻度为 Mo Tu We Th Fr Sa Su 现在我希望 Mo 是绿色的 Tu 是蓝色的 等
  • 在 python 中查找价格动量的有效方法:对列的最后 n 个条目求平均值

    我正在定义价格动量是给定股票过去动量的平均值n days 反过来 动量是一种分类 如果当天的收盘价高于前一天 则每天标记为 1 如果当天的收盘价低于前一天 则标记为 1 我的库存变化百分比如下 df close in percent np
  • 从另一个文件覆盖函数中的变量

    一 总结 我不知道如何从另一个文件覆盖函数中的变量 2 示例 2 1 配置 I use logbook http logbook pocoo org and pyfancy https github com ilovecode1 Pyfan
  • 使用正则表达式检查整个字符串

    我正在尝试检查字符串是否是数字 因此正则表达式 d 似乎不错 然而 由于某种原因 该正则表达式也适合 78 46 92 168 8000 这是我不想要的 一些代码 class Foo rex re compile d def bar sel
  • Python 排列(包括子字符串)

    我遇到过这个帖子 如何在Python中生成列表的所有排列 https stackoverflow com questions 104420 how to generate all permutations of a list in pyth
  • 如何在 Django 1.4 中自定义管理过滤器

    我是 Python 和 Django 开发的新手 我从社区提供的易于阅读的示例中学到了很多东西 但最近我想为 Django 附带的管理控制台实现一个自定义的管理过滤器 我进行了很多搜索 只发现了一些过时的方法来完成它 例如 Django 1
  • Selenium 上的切换窗口

    我在 Python 中使用 Selenium 和 PhantomJS 我需要打开一个新窗口并控制它 出于测试目的 我这样做 from selenium import webdriver driver webdriver PhantomJS
  • python matplotlib 使用按钮事件添加和删除图形中的文本

    我试图在调用button press event 时将文本添加到鼠标指针位置的图形中 并在调用button release event 时将其删除 我已成功添加文本 但无法将其删除 这是我使用的代码的一部分 def onclick even
  • Tkinter:通过多处理启动进程会创建不需要的新窗口

    我计划围绕数值模拟编写一个小型 GUI 这就是我现在使用 Tkinter 的原因 模拟应在单独的进程中从 GUI 启动 为了玩一下 我定义了一个函数 random process 来生成成对的 randn 数字 这应该是一个真正的模拟过程
  • 在Python中将用户昵称转换为正式名字

    我正在尝试根据 Python 中的用户名字和姓氏映射来自不同系统的用户 一个问题是 名字在很多情况下都是 昵称 例如 对于用户来说 他的名字在一个系统中是 Dave 而在另一个系统中是 David python 中有没有简单的方法可以将这些
  • 将 Selenium 与 PyCharm CE 结合使用

    我正在尝试将 Selenium 与 PyCharm CE 一起使用 我已经使用 pip install Selenium 安装了 Selenium 并且可以通过终端使用它 但是当我尝试将它与 PyCharm 一起使用时 出现导入错误 Imp
  • 我无法设置顶级标题

    我想为 TopLevel 设置标题 但 TopLevel 显示 Root 的标题 我认为我的下一个脚本与 TkInter 文档中的示例相对应 但给了我不好的结果 你能解释一下 为什么我的设置master title 顶部 in 应用程序顶部
  • 在Python中通过sys.stdout写入unicode字符串

    暂时假设一个人无法使用print 从而享受自动编码检测的好处 所以这给我们留下了sys stdout 然而 sys stdout太蠢了不做任何合理的编码 http bugs python org issue4947 现在人们阅读 Pytho
  • Spark (Python) 中的 Kolmogorov Smirnov 测试不起作用?

    我正在 Python Spark ml 中进行正态性测试 看到了我的结果think是一个错误 这是设置 我有一个标准化的数据集 范围 1 到 1 当我做直方图时 我可以清楚地看到数据不正常 gt gt gt prices norm hist
  • 通过过滤对 Pyspark Dataframe 进行分组

    我有一个数据框如下 cust id req req met 1 r1 1 1 r2 0 1 r2 1 2 r1 1 3 r1 1 3 r2 1 4 r1 0 5 r1 1 5 r2 0 5 r1 1 我必须观察客户 看看他们有多少要求 看看
  • 如何测试send_file烧瓶

    我有一个小型烧瓶应用程序 它需要上传一些图像并将它们转换为多页 tiff 没什么特别的 但是如何测试多个文件的上传和文件下载呢 我的测试客户端 class RestTestCase unittest TestCase def setUp s

随机推荐

  • 如何检测文本文档之间的重复项并返回重复项的相似度?

    我正在编写一个爬虫来从某个网站获取内容 但是内容可以重复 我想要 以避免这种情况 所以我需要一个函数可以在两个文本之间返回相同的百分比来检测两个可能重复的内容示例 文本 1 我正在编写一个爬虫 文本2 我正在编写一些文本爬虫来获取 比较函数
  • 为什么同一类的对象可以访问彼此的私有数据?

    为什么同一类的对象可以访问彼此的私有数据 class TrivialClass public TrivialClass const std string data mData data const std string getData co
  • React Navigator StackNavigator:从同一场景调用两次时 goBack 不起作用

    假设我想实现一个具有目录结构的文件浏览器 我创建了一个 React Native 组件 它列出了特定文件夹的文件和目录 当我单击一个文件夹时 我希望进入新文件夹并列出其文件和文件夹 显然 我希望能够使用相同的 React 组件来渲染不同的文
  • 使用嵌套属性的 Rails 中多对多关系的下拉菜单

    我通过多对多关联有三个表 超市 产品和供应 每个超市可以存放多种产品 每种产品可以在多个超市销售 该关联是通过供应模型建立的 超级市场 class Supermarket lt ActiveRecord Base attr accessib
  • FTP 传入监控(上传时)

    我们有大约 100 个用户通过 FTP 登录并上传文件 我们的在线系统 PHP 应该显示刚刚上传的项目 我不想继续检查所有不同的 FTP 文件夹来检查新文件 在不降低服务器速度的情况下 使用 PHP 检查新文件的最佳方法是什么 所有用户都在
  • iOS6 在非越狱设备上切换 WiFi

    我正在开发一个内部 iOS 应用程序 不适用于苹果商店 所以我很乐意使用私有 API 并且我希望能够以编程方式打开或关闭 wifi 我想要这样做的原因是 对于某些 WiFi 路由器 每当互联网连接中断时 iPad 就无法恢复 WiFi 不过
  • 为什么下面的结果是零? [复制]

    这个问题在这里已经有答案了 下面的每个 print 语句都会产生 0 0 var c Double 0 0 let a Int 1 let b Int 5 print a b Double a b 100 c Double a b 100
  • 为什么 Ruby on Rails 弃用脚手架方法

    我正在学习 Ruby on Rails 所以我相信我迟早会发现这一点 为什么在 Rails 版本 2 中不推荐使用脚手架方法 脚手架方法违背了脚手架的精神 脚手架的目的是为您提供一个起点 您应该在此基础上根据自己的需求进行构建 通过动态生成
  • 缩小的单个捆绑包与通过 http/2 的多个文件

    对于 CSS 和 JS 捆绑 一般建议是什么 是将所有内容捆绑到一个文件中更好 还是提供多个文件更好 我个人认为多个文件更好 尤其是使用 http 2 但是捆绑有很好的理由 当所有内容都在一个文件中时 缩小和 gzip 会产生更好的结果 因
  • Ruby on Rails 中的“分配”有什么作用?

    我目前正在尝试学习Ruby on Rails和测试框架RSpec 什么是assigns在这个 RSpec 测试中做什么 describe GET index do it assigns all mymodel as mymodel do m
  • 线程中的临界区是什么?

    请有人能举例简单地告诉我临界区的含义是什么 用简单的语言 A 临界区 http en wikipedia org wiki Critical section是需要在没有外部干扰的情况下执行的代码部分 即没有其他线程可能影响该部分内的 中间
  • TypeScript 中的私有静态属性

    如果我执行下面类似的操作 如何从类中访问该属性 class Person private static name string console log Person name 不是应该无法访问吗 这应该是一个错误 但事实并非如此 根据规范第
  • 如何创建分支?

    如何在SVN中创建分支 使用创建一个新分支svn copy命令如下 svn copy svn ssh host example com repos project trunk svn ssh host example com repos p
  • 派生类中类模板的部分特化会影响基类

    我有一个元功能 struct METAFUNCION template
  • 在 WooCommerce 管理订单列表中添加自定义操作按钮

    我已关注本说明 https fernandoacosta net blog 2015 06 07 woocommerce adicionar novo status de pedido 为我的 WooCommerce 订单添加自定义订单状态
  • 如何修复应用程序构造函数中的异常

    我是 Javafx 新手 我刚刚下载了 JDK 12 并遵循了教程 它已经工作但对我不起作用 我正在使用模块来要求 javafx controls 这是代码 在我的主课中 我在SOFlow中尝试了很多解决方案但没有结果 我尝试了 1 将 p
  • 在 C# 中序列化和存储对象的最简单方法?

    我正在寻找一个简单的解决方案来序列化和存储包含配置 应用程序状态和数据的对象 它是一个简单的应用程序 数据不多 速度不是问题 我希望它正在进行中 我希望它在文本编辑器中比在 xml 中更容易编辑 我找不到任何可以在进程中处理它的 net 文
  • 如何使用Beautifulsoup4等待网站返回数据

    我使用 beautifulsoup4 编写了一个脚本 该脚本基本上从网页上的表格中获取密码列表 问题是我的 python 脚本不会等待网页返回的内容 并且会中断或显示 列表索引超出范围 代码如下 ssl lab url https www
  • 谷歌 reCaptcha V3 中的“浏览器错误”(不可见)

    我正在使用 google reCaptcha v3 不可见 但我收到了一些响应负载 success false error codes browser error 我用谷歌搜索但没有找到任何有关 浏览器错误 的信息 从 7900 个 reC
  • npm、pip、pipenv 和 Poetry 包管理器之间的功能比较 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 主要特点是怎样的npm与之比较pip pipenv and Poetry https python poetry org 包管理器 我