Python有哪些与Ruby的bundler / Perl的carton相当的工具?

99

我知道virtualenv和pip。但这些与bundler/carton有一点不同。

例如:

  • pip将绝对路径写入shebang或activate脚本
  • pip没有exec子命令(bundle exec bar
  • virtualenv将Python解释器复制到本地目录

每个Python开发者都使用virtualenv/pip吗?是否还有其他Python包管理工具?


4
不,不是每个Python用户都使用virtualenv。我个人从未需要它。 - Fred Foo
我不知道是否有类似于 Ruby bundler 的东西(顺便说一下,直到现在我才知道这个)。我通常使用 virtualenv、pip、setuptools - 或者 distutils 或任何我在 Google 上找到的分发系统 :) 我也很好奇答案,但这是我大多数时候使用的解决方案。 - brandizzi
由于这个问题被提出,pipenvshovel是更现代的选择。 - Jim Meyer
2
既不是pipenv也不是shovel是等价的。Shovel与bundler完全不同,更像rake。Python依赖管理相当落后。但它总有一天会被合并到pip中(https://pypi.org/project/pipfile/)... - Nomas Prime
8个回答

76

据我所了解,关于bundler的内容,没有virtualenv的pip应该可以很好地为您工作。您可以将其视为常规gem命令和bundler之间的某种东西。使用pip可以执行的常见操作:

  1. 安装包(gem install)

    pip install mypackage
    
  2. 依赖项和批量安装(Gemfile)

    可能最简单的方法是使用 pip 的 requirements.txt 文件。基本上它只是一个包含可能的版本约束的必需软件包的纯文本列表。它可能看起来像这样:

  3. nose==1.1.2
    django<1.3
    PIL
    

    后来当您想要安装这些依赖项时,您将执行以下操作:

    $ pip install -r requirements.txt
    

    查看当前所有包的要求(requirements)文件语法的简单方法是执行以下命令:

    $ pip freeze
    

    你可以在这里了解更多

  4. 执行(bundler exec)

    所有带有可执行文件的Python包通常安装后直接可用(除非你有自定义设置或这是一个特殊的包)。例如:

  5. $ pip install gunicorn
    $ gunicorn -h 
    
  6. 使用bundler包将gem打包以从缓存中安装

    pip bundlepip zip/unzip。但我不确定是否有很多人使用它们。

p.s. 如果您关心环境隔离,也可以与pip一起使用virtualenv(它们是好朋友并且完美地协作)。默认情况下,pip会在系统范围内安装软件包,这可能需要管理员权限。


50
Bundler的优点在于它集成了virtualenv部分,并且大多数情况下不需要管理员权限。实际上,bundle可能是唯一需要全局安装的gem。bundle install --path vendor会将所有内容本地安装,而bundle exec聪明地发现这一点,无需显式更改环境。 - Debilski
12
我不认为第三点是正确的。运行 Ruby 可执行文件可以使用 bundle exec 或不使用。bundle exec 的整个意义在于在运行可执行文件之前按照 Gemfile 更改环境。Pip 没有类似于 bundle exec 的功能,虚拟环境可能有。 - Sean Mackesey
@SeanMackesey 每当您运行虚拟环境的激活命令时,您立即进入该环境,例如,Python指向环境中的Python而不是全局安装的Python,Python路径与环境相关联,所有应用程序也从该环境运行。 - Denys Shabalin
12
Bundler的主要特点是现在已经成为事实上的标准,你可以几乎确定任何规模的Ruby项目都会有一个名为Gemfile的文件位于根目录中,你只需执行bundle install就能运行项目了,或者使用bundle --deployment来在服务器上运行,只要机器上有所需版本的ruby即可。Python没有类似的东西。工具都有,但文化上的普及度却不够。 - ocodo
1
使用 pip install 相当于在使用 rbenv 的情况下使用 gem install - 它是操作系统/用户级别的软件包。而 bundle 及其 Gemfile 主要用于项目依赖管理。它具有许多优化模块存储、安装、升级工作流程的功能,比普通的 gem 工作流程更加先进。 - x'ES

19
你可以使用pipenv,它与bundler有相似的界面。
$ pip install pipenv

Pipenv 可以自动创建 virtualenv 并从 PipfilePipfile.lock 中安装依赖。

$ pipenv --three           # Create virtualenv with Python3
$ pipenv install           # Install dependencies from Pipfile
$ pipenv install requests  # Install `requests` and update Pipfile
$ pipenv lock              # Generate `Pipfile.lock`
$ pipenv shell             # Run shell with virtualenv activated

你可以像 bundle exec 一样在虚拟环境中运行命令。

$ pipenv run python3 -c "print('hello!')"

3
Python Poetry是2020年(甚至自2018年以来)与Ruby bundler最相近的工具。它已经超过两岁,仍然非常活跃,并且有很棒的文档。人们可能会抱怨使用“curl-pipe-python”样式进行安装的方式是推荐的,但是也有其他选择,例如在macOS上使用Homebrew。 它在幕后使用虚拟环境(与bundler不同),但提供并使用锁定文件,处理子依赖项,遵守指定的版本约束,并允许自动更新过时的软件包。甚至还可以为你喜欢的shell提供自动补全功能。
通过使用pyproject.toml文件,它比bundler更进一步(更接近于gemspec)。它也类似于JavaScript和TypeScript的npm和yarn。 Poetrify(一个补充项目)有助于将项目从 requirements.txt 转换为 Poetry 中的 pyproject.toml。
如果您需要将锁定文件导出到 requirements.txt,可以使用命令 poetry export -f requirements.txt > requirements.txt,以供其他工具使用(或者在不太可能的情况下需要返回 requirements.txt)。

3

现在有一个pbundler的克隆版本。

目前在pip中的版本只是读取你已经拥有的requirements.txt文件,但是它已经非常过时了。而且它并不完全等同:它坚持要创建一个virtualenv。我注意到,Bundler只安装缺少的软件包,并给您提供了一些选项,可以输入sudo密码以安装到系统目录或重新启动,这似乎不是pbundler的特性。

然而,git上的版本几乎完全重写,更接近Bundler的行为...包括具有“Cheesefile”,现在不支持requirements.txt。这很不幸,因为requirements.txt是Python领域的事实标准,甚至有官方的BDFL工作来标准化它。当这个标准生效时,你可以确定像pbundler这样的东西将成为事实上的标准。可惜,据我所知,还没有什么稳定的东西(但我会很高兴被证明是错的)。


这个项目似乎已经消失了。可以考虑使用Poetry:https://dev59.com/questions/Q2oy5IYBdhLWcg3wKrCs#61771381 - bb.

2

我写了一个工具 — https://github.com/Deepwalker/pundler 。 在PIP上它的名字是pundle,因为这个名字已经被占用了。

它使用requirements(_\w+)?.txt文件来指定你需要的依赖项,并创建带有冻结版本的frozen(_\w+)?.txt文件。

关于(_\w+)?这个东西——这是环境。你可以创建requirements_test.txt文件,然后使用PUNDLEENV=test来在运行时与requirements.txt一起使用这些依赖项。

至于virtualenv——你不需要一个,因为这正是pundle从bundler中首先获取的。


1
我会说Shovel值得一看。它是专门为Python版本的Rake开发的。该项目没有太多的提交活动,但似乎稳定且有用。

1
您可以使用 pipx 自动安装和运行 Python 应用程序的隔离环境。
您可以使用 pipenv 自动创建和管理项目的虚拟环境。
两者都使用虚拟环境工具包装 pip,并针对不同的用例。
所有这些项目都是 GitHub PyPA 仓库 中最受欢迎的之一。
FYI:Debian bullseye/testing 目前缺少 pipx。但来自 sid 的软件包应该可以正常工作。(2021-06-19)

0

不是所有的开发者都使用virtualenv和/或pip,但许多开发者使用/偏好这些工具。

现在,对于软件包开发工具和不同的环境,这才是您真正关心的问题。存在其他类似Buildout(http://www.buildout.org/en/latest/)的工具,用于隔离每个项目的Python构建系统。我曾经使用过一段时间,但现在不再使用。

在Python中,每个项目的独立环境与Ruby中的相同情况略有不同。在我的情况下,我使用pyenv(https://github.com/yyuu/pyenv),它类似于rbenv,但适用于Python。每个项目有不同版本的Python和虚拟环境,在这些隔离的环境中,我可以使用pip或easy-install(如果需要)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接