Python中相当于Ruby的bundler/Perl的carton是什么?

99 投票
8 回答
29981 浏览
提问于 2025-04-17 09:31

我知道虚拟环境(virtualenv)和pip这两个工具。但它们和bundler/carton有点不同。

举个例子:

  • pip会把绝对路径写入到shebang或者激活脚本中。
  • pip没有exec这个子命令(比如bundle exec bar)。
  • 虚拟环境会把Python解释器复制到一个本地目录里。

每个Python开发者都会使用虚拟环境和pip吗?还有其他的Python包管理工具吗?

8 个回答

4

Python Poetry 是一种工具,跟 Ruby 的 bundler 很像,最早在 2018 年就出现了,到 2020 年时已经是最接近的选择。它已经有两年多的历史了,仍然非常活跃,并且有很好的文档支持。有人可能会抱怨推荐的安装方式是用 curl-pipe-python,不过也有其他选择,比如在 macOS 上可以用 homebrew。

它在后台使用虚拟环境(virtualenvs),这和 bundler 不一样,但它提供并使用一个锁定文件(lock-file),可以处理子依赖,遵循指定的版本限制,并允许自动更新过时的包。它甚至支持你最喜欢的命令行工具的自动补全功能。

通过使用一个叫 pyproject.toml 的文件,它的功能比 bundler 更强大(更接近于 gemspec)。它也可以和 JavaScript 和 TypeScript 的 npm 和 yarn 相提并论。

Poetrify 是一个辅助项目,可以帮助将项目从 requirements.txt 转换为 Poetry 的 pyproject.toml。

如果你需要把锁定文件导出为 requirements.txt,可以用 poetry export -f requirements.txt > requirements.txt,这样可以方便其他工具使用(或者在不太可能的情况下想要回退时用)。

19

你可以使用 pipenv,它的界面和 bundler 很像。

$ pip install pipenv

Pipenv 会自动创建一个虚拟环境,并从 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!')"
75

根据我了解到的关于打包工具的内容——不使用虚拟环境的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
    

    想要查看你当前所有包的requirements文件格式,可以这样做:

    $ pip freeze
    

    你可以在这里了解更多信息。

  3. 执行(类似于bundler exec)

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

    $ pip install gunicorn
    $ gunicorn -h 
    
  4. 从缓存中打包安装的包(类似于bundler package)

    pip zip/unzip。不过我不确定有多少人会使用它。

附注:如果你关心环境隔离的话,你也可以把virtualenv和pip一起使用(它们是好搭档,配合得很好)。默认情况下,pip会在系统范围内安装包,这可能需要管理员权限。

撰写回答