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
:
我发现两个现有的软件包声称可以做到这一点:
-
Pipenv 工具 https://pypi.org/project/pipenv-tools/- 但是已经两年没有更新了,里面没有代码src
目录,但我无法让它工作。
-
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 存储库(见上图)。