Python中相当于Ruby的bundler/Perl的carton是什么?
我知道虚拟环境(virtualenv)和pip这两个工具。但它们和bundler/carton有点不同。
举个例子:
- pip会把绝对路径写入到shebang或者激活脚本中。
- pip没有
exec
这个子命令(比如bundle exec bar
)。 - 虚拟环境会把Python解释器复制到一个本地目录里。
每个Python开发者都会使用虚拟环境和pip吗?还有其他的Python包管理工具吗?
8 个回答
Python Poetry 是一种工具,跟 Ruby 的 bundler 很像,最早在 2018 年就出现了,到 2020 年时已经是最接近的选择。它已经有两年多的历史了,仍然非常活跃,并且有很好的文档支持。有人可能会抱怨推荐的安装方式是用 curl-pipe-python
,不过也有其他选择,比如在 macOS 上可以用 homebrew。
- 官方网站: https://python-poetry.org/
- Github: https://github.com/python-poetry/poetry
- 文档: https://python-poetry.org/docs/
它在后台使用虚拟环境(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
,这样可以方便其他工具使用(或者在不太可能的情况下想要回退时用)。
你可以使用 pipenv,它的界面和 bundler 很像。
$ pip install pipenv
Pipenv 会自动创建一个虚拟环境,并从 Pipfile
或 Pipfile.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!')"
根据我了解到的关于打包工具的内容——不使用虚拟环境的pip应该对你来说没问题。你可以把它看作是普通的gem命令和打包工具之间的一种东西。使用pip你可以做的常见事情有:
安装包(类似于gem install)
pip install mypackage
依赖关系和批量安装(类似于gemfile)
最简单的方法是使用pip的requirements.txt文件。基本上,这只是一个需要的包的简单列表,可能还会有版本限制。它可能看起来像这样:
nose==1.1.2 django<1.3 PIL
当你想要安装这些依赖时,你可以这样做:
$ pip install -r requirements.txt
想要查看你当前所有包的requirements文件格式,可以这样做:
$ pip freeze
你可以在这里了解更多信息。
执行(类似于bundler exec)
所有带有可执行文件的Python包在安装后通常都可以直接使用(除非你有自定义设置或者这是一个特殊的包)。例如:
$ pip install gunicorn $ gunicorn -h
从缓存中打包安装的包(类似于bundler package)
有
和 pip zip/unzip
。不过我不确定有多少人会使用它。
附注:如果你关心环境隔离的话,你也可以把virtualenv和pip一起使用(它们是好搭档,配合得很好)。默认情况下,pip会在系统范围内安装包,这可能需要管理员权限。