【问题标题】:What are the Python equivalents to Ruby's bundler / Perl's carton?Ruby 的 bundler / Perl 的纸箱的 Python 等价物是什么?
【发布时间】:2012-02-02 07:34:24
【问题描述】:

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

例如:

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

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

【问题讨论】:

  • 不,不是每个 Python 用户都使用 virtualenv。我个人从来不需要它。
  • 我不知道像 Ruby bundler(我直到现在才知道,顺便说一句)这样的东西完全。我用来做的是同时使用 virtualenv and pip and setuptools - 或 distutils 或我首先在 Google 中找到的任何分发系统 :) 我也很好奇答案但大多数时候这是我的解决方案。
  • 自从提出这个问题以来,下面提到的 pipenvshovel 是更现代的选择。
  • pipenv 和 shovel 都不等价。铲子一点也不像打包机,更像是耙子。 Python 依赖管理远远落后。不过总有一天会合并到 pip 中 (pypi.org/project/pipfile)...

标签: python ruby perl virtualenv pip


【解决方案1】:

从我读到的关于 bundler 的内容来看——没有 virtualenv 的 pip 应该对你很好。您可以将其视为常规 gem 命令和捆绑程序之间的某种东西。你可以用 pip 做的常见事情:

  1. 安装包(gem install)

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

    可能最简单的方法是使用 pip 的 requirements.txt 文件。基本上,它只是一个包含可能版本限制的所需软件包的简单列表。它可能看起来像:

    nose==1.1.2
    django<1.3
    PIL
    

    稍后当您想要安装这些依赖项时,您会这样做:

    $ pip install -r requirements.txt
    

    以需求文件语法查看所有当前包的简单方法是:

    $ pip freeze
    

    您可以阅读更多关于它的信息here

  3. 执行(捆绑器执行)

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

    $ pip install gunicorn
    $ gunicorn -h 
    
  4. 用于从缓存安装的包 gem(捆绑包)

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

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

【讨论】:

  • bundler 的优点在于 virtualenv 部分是集成的,在大多数情况下不需要管理员权限。事实上,bundle 很可能是全球唯一需要的宝石。 bundle install --path vendor 在本地安装所有东西,bundle exec 足够聪明,可以解决这个问题。无需显式更改环境。
  • 我不认为第 3 点是正确的。无论有没有bundle exec,都可以简单地运行一个ruby 可执行文件。 bundle exec 的全部意义在于它在运行可执行文件之前根据 Gemfile 更改环境。 Pip 不等同于 bundle exec,尽管 virtualenv 可能。
  • @SeanMackesey 每当您运行 virtualenv 环境的激活时,您都会立即进入环境,例如python指向环境中的那个,不是全局安装的,pythonpath相对于环境是正确的,所有应用程序也从那个环境运行。
  • 关于 bundler 的主要事情是它现在是一个事实上的标准,你几乎可以保证任何大小的 ruby​​ 项目,都会有一个 Gemfile 在它的根,你可以@ 987654336@,你很高兴,或者bundle --deployment,它只会在服务器上运行,只要机器上有所需的 ruby​​ 版本就可以了。 Python 根本没有等价物。工具在那里,文化无处不在。
  • 使用pip install 相当于使用gem installrbenv - 它是操作系统/用户级别的包。而bundleGemfile 首先是项目依赖管理。它对模块存储、安装、升级工作流程进行了一系列优化,提前到普通的 gem 工作流程。
【解决方案2】:

你可以使用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

您可以运行带有 virtualenv 范围的命令,例如 bundle exec

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

【讨论】:

    【解决方案3】:

    有一个克隆pbundler

    当前在 pip 中的版本只是读取您已经拥有的 requirements.txt 文件,但已经过时了。它也不完全等同:它坚持制作virtualenv。我注意到,Bundler 只安装缺少的包,并让您选择提供 sudo 密码以安装到系统目录或重新启动,这似乎不是 pbundle 的功能。

    然而,git 上的版本几乎是完全重写,更接近 Bundler 的行为......包括有一个“Cheesefile”,现在不支持 requirements.txt。这是不幸的,因为 requirements.txt 是 pythonland 中的事实标准,甚至还有官方 BDFL 标记的工作到standardize it。当它生效时,您可以确定 pbundle 之类的东西将成为事实上的标准。唉,我所知道的还没有什么稳定的(但我喜欢被证明是错误的)。

    【讨论】:

    【解决方案4】:

    我写了一个——https://github.com/Deepwalker/pundler。 在 PIP 上,其 pundle 的名称已被占用。

    它使用requirements(_\w+)?.txt 文件作为您所需的依赖项,并创建具有冻结版本的frozen(_\w+)?.txt 文件。

    关于(_\w+)? 的东西——这是环境。您可以创建 requirements_test.txt,然后使用 PUNDLEENV=test 在您的运行中使用此 deps,并与 requirements.txt 一起使用。

    关于 virtualenv – 你不需要一个,它是 pundle 从第一个 head 中的 bundler 中获取的。

    【讨论】:

      【解决方案5】:

      截至 2020 年(自 2018 年以来),Python Poetry 是最接近 Ruby 捆绑器的工具。它已经有两年多了,仍然很活跃,有很好的文档。有人可能会抱怨 curl-pipe-python-style 是推荐的安装方式,但还有其他选择,例如macOS 上的自制软件。

      它在幕后使用 virtualenvs(与 bundler 不同),但它提供并使用了一个锁文件,处理子依赖项,遵守指定的版本约束并允许自动更新过时的包。您最喜欢的 shell 甚至还有自动补全功能。

      通过使用 pyproject.toml 文件,它也比 bundler 更进一步(更接近 gemspec。它也可以与 JavaScript 和 TypeScript 的 npm 和 yarn 相媲美)。

      Poetrify(一个补充项目)帮助将项目从 requirements.txt 转换为 pyproject.toml for Poetry。

      锁定文件可以通过poetry export -f requirements.txt &gt; requirements.txt 导出到 requirements.txt,如果您需要其他工具(或者不太可能的情况想要返回)。

      【讨论】:

        【解决方案6】:

        我会说Shovel 值得一看。它是专门为 Rake 的 Pythonish 版本开发的。该项目没有大量的提交活动,但看起来稳定且有用。

        【讨论】:

          【解决方案7】:

          您可以使用pipx 在独立环境中自动安装和运行 Python 应用程序。

          您可以使用pipenv 自动为您的项目创建和管理虚拟环境。

          两者都使用虚拟环境工具包装pip,并针对不同的用例。

          所有这些都是github PyPA repository 中列出的最受关注的项目之一。

          仅供参考:Debian 靶心/测试目前缺少 pipx。但是来自 sid 的包应该可以正常工作。 (2021-06-19)

          【讨论】:

            【解决方案8】:

            不,并非所有开发人员都使用 virtualenv 和/或 pip,但许多开发人员使用/更喜欢这些工具

            现在,对于包开发工具和不同的环境,这是您真正的问题。存在任何其他工具,如 Buildout (http://www.buildout.org/en/latest/) 用于相同目的,为您管理的每个项目隔离您的环境 Python 构建系统。有一段时间我用这个,但不是现在。

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

            【讨论】:

              猜你喜欢
              • 2016-06-12
              • 2012-03-20
              • 1970-01-01
              • 2013-11-14
              • 2011-04-12
              • 1970-01-01
              • 1970-01-01
              • 2011-02-02
              • 2014-12-29
              相关资源
              最近更新 更多