npm
与pip
,pipenv
和poetry
包管理器相比的主要功能如何?以及如何使用pipenv
or的这些功能poetry
?
这主要可以帮助某人从 JavaScript 开发人员过渡到 python 开发人员。
我从未使用过使用过的 rubygems,但将它的主要功能与主要的 python 包管理器进行比较也可能很有用。帮助任何有红宝石背景的人。
npm
与pip
,pipenv
和poetry
包管理器相比的主要功能如何?以及如何使用pipenv
or的这些功能poetry
?
这主要可以帮助某人从 JavaScript 开发人员过渡到 python 开发人员。
我从未使用过使用过的 rubygems,但将它的主要功能与主要的 python 包管理器进行比较也可能很有用。帮助任何有红宝石背景的人。
功能\包管理器 | npm | 点子 | 管道 | 诗歌 |
---|---|---|---|---|
访问主仓库(即 Pypi/npm) | ✓</td> | ✓</td> | ✓</td> | ✓</td> |
记录顶层依赖 | ✓</td> | ✗</td> | 点文件 | pyproject.toml |
记录开发依赖 | ✓</td> | ✗</td> | 点文件 | pyproject.toml |
锁定所有依赖项的版本 | ✓</td> | ✓</td> | Pipfile.lock | 诗歌锁 |
在解释器版本之间切换 | 非易失性 | ✗</td> | ✗</td> | ✓</td> |
直接出版 | ✓</td> | ✗</td> | ✓* | ✓</td> |
运行脚本 | ✓</td> | ✗</td> | 点文件 | ✗</td> |
可编辑的本地包 | ✓</td> | ✓</td> | ✓</td> | ✓</td> |
与 Intellij 集成 | ✓</td> | ✓</td> | 部分的 | ✗</td> |
pipenv
如果使用 3rd 方开发依赖项和将它们绑定在一起的脚本,则可以直接发布,见下文。免责声明:我只有在 'NIX 系统(特别是 OSX)上使用这些包管理器的经验,将pipenv
自己推销为将 Windows 视为一等公民,我不确定如果没有pyenv
,它是如何工作的,就 Windows 而言,它不可用我知道。
为了充分利用pipenv
,pyenv
应该安装。pipenv
将能够检测和使用任何安装的 python 版本pyenv
,即使它没有被激活。例如,如果 aPipfile
已将 python 3.4 列为要求:要成功运行pipenv install
,pyenv install 3.4.0
应首先运行。
要创建一个新的Pipfile
venv(使用 python 3.7.x):
>>> pipenv --python 3.7
或者从现有的安装依赖项Pipfile.lock
使用下面的命令。此命令还可用于创建 aPipfile
和 venv(默认为最新的可用 python 版本)。
>>> pipenv install
在创建的 venv 中运行命令:
>>> pipenv run <script or command>
例如
>>> pipenv run python main.py
Poetry 仍然使用,但方式不同:在调用orpyenv
之前必须激活您要使用的 python 版本。poetry install
poetry run
可以pyproject.toml
使用以下方法创建:
>>> poetry init
或者可以使用以下方法创建完整的目录结构:
>>> poetry new <dir>
在我们可以安装之前,我们必须激活与pyproject.toml
文件中指定的内容相匹配的 python 版本。
>>> pyenv global <python version specified in pyproject.toml>
现在我们可以使用以下命令创建 venv,如果存在poetry.lock
文件,它将安装其中列出的所有依赖项。
>>> poetry install
在创建的 venv 中运行命令:
>>> poetry run <command>
如果我们使用更改全局 python 版本,pyenv
我们将不再能够在创建的 venv 中运行命令。如果我们使用本地创建的 venv,则有一个例外,见下文。
有时最好检查一下您的代码是否适用于 python 3.7 和 python 3.4。这不是我们可以想当然的事情。
只能通过删除 venv 来使用不同的 python 版本重新创建它:
>>> rm -rf <path to venv>
>>> pipenv --python <different python version>
可能会显示一条警告,表明 venv 的 python 版本与 . 中指定的不匹配Pipfile
,但据我所知,这只是一个警告。
https://github.com/pypa/pipenv/issues/1071
诗歌更适合这个用例:可以并排创建多个 venv。要创建和使用新的 venv 切换 python 版本,请使用pyenv
然后创建一个新的 venv。
>>> pyenv global <different python version>
>>> poetry install
如果 python 版本与指定的版本不匹配,则会引发错误,pyproject.toml
但是可以使用 semver 版本控制指定一系列 python 版本。
我更喜欢将我的 venv 安装在.venv
我的项目本地的文件夹中,这类似于npm
工作方式,如果发生任何奇怪的事情或者如果(在 pipenv 的情况下)我想轻松更改哪个版本,我可以删除该文件夹并重新安装我正在使用的python。
要启用此功能:设置以下环境变量。
>>> export PIPENV_VENV_IN_PROJECT="enabled"
可以使用以下命令启用此功能:
>>> poetry config settings.virtualenvs.in-project true
但请注意,这会改变 的行为poetry
,将无法在不同版本的 python 之间快速切换:即使使用pyenv
运行的所有命令切换 python 版本,poetry run
也会使用 venv(及其关联的 python 版本)驻留在本地目录中。
https://github.com/sdispater/poetry/issues/108
软件包很容易安装并自动添加到Pipfile
和Pipfile.lock
文件中,使用:
>>> pipenv install [--dev] <package name>
该--dev
标志表示开发依赖性。使用时默认不会安装开发依赖pipenv install
。
也可以安装本地包,让您可以使用它们并立即查看您的更改:
>>> pipenv install -e <path to local package>
软件包很容易安装并自动添加到pyproject.toml
和poetry.lock
文件中,使用:
>>> poetry add [--dev] <package name>
该--dev
标志表示一个开发依赖,使用时默认不安装开发依赖,poetry install
发布时添加到包中。
也可以安装本地包,让您可以使用它们并立即查看您的更改:
>>> poetry add --path <path to local package> <name of package>
不确定为什么需要包的名称,因为它应该已经由本地包定义。此外,作者似乎不相信通常链接本地包(https://github.com/sdispater/poetry/issues/34),所以随着时间的推移,这个功能可能会被遗忘。
为了清楚起见,我指的是npm
所谓的脚本,它与文件中指定的脚本不同setup.py
。
在开发时,有时为难以记住的命令设置快捷方式很有用,例如运行目录中每个测试文件的命令是:
>>> python -m unittest discover -s <test_folder> -p '*_test.py'
使用这些命令的快捷方式要方便得多。
支持此功能:将以下内容放入Pipfile
:
[scripts]
test = "pipenv run python -m unittest discover -s tests -p '*_test.py'"
不支持,未来不太可能添加:https ://github.com/sdispater/poetry/pull/591#issuecomment-504762152
最好能够在不制作额外setup.py
文件的情况下发布到 PyPi,如果发布包所需的所有信息都包含在包管理文件中,这将是可能的。
据我所知,这就是 pipenv 名声不好的地方。setup.py
文件仍然需要发布到 PyPi,不,它们不会自动填充来自Pipfile
.
推荐的方法是在发布时手动复制依赖项,或者让 Pipfile 安装setup.py
文件中列出的依赖项,但是,setup.py
运行时不会自动更新pipenv install <package name>
。
如果你真的希望你Pipfile
依赖你的setup.py
文件,这就是它的完成方式:
>>> pipenv install '-e .'
https://github.com/pypa/pipenv/issues/2805,https://realpython.com/pipenv-guide/#yes-i-need-to-distribute-my-code-as-a-package,https _ _ _ _ ://github.com/pypa/pipenv/issues/209
呸!
所以理想情况下,我们希望setup.py
从以下文件派生一个文件Pipfile
:
我发现了两个声称可以做到这一点的现有软件包:
https://pypi.org/project/pipenv-tools/ - 但是已经两年没有更新了,src
目录中没有代码,我无法让它工作。
https://pypi.org/project/pipenv-setup/ - 但它同步的Pipfile.lock
而不是Pipfile
,这是一种反模式。锁定文件旨在创建一个可重现的环境,它过于严格(例如,不允许更新依赖项)用于setup.py
. 出于这个原因,我什至没有尝试使用它。
我很快写了一个包,生成一个install_requires.py
可以在文件中导入的setup.py
文件:https ://pypi.org/project/pipenv2setup/ (在Windows上未经测试)。
有关发布 pipenv 项目时如何使用该包的示例,请参阅此 github repo:
https://github.com/alanbacon/pipenvExample
使用诗歌发布你的包真的很容易,你根本不需要setup.py
文件。只需运行:
>>> poetry publish [--build] [--username <username>] [--password <password>]
发布的包pip
不仅可以通过其他实例安装poetry
。
有关如何从使用 a 迁移setup.py
到纯pyproject.toml
文件的信息,请参见此处:https ://johnfraney.ca/posts/2019/05/28/create-publish-python-package-poetry/
Pycharm 能够通过使用Piplock
文件来检测 venv,但是使用 Pycharm 接口添加新包不会修改Piplock
文件。
在撰写本文时,Pycharm 似乎不知道任何诗歌虚拟环境或似乎以pyproject.toml
任何方式解析文件。
在poetry
您必须使用 semver 指定 python 和包的版本(必须使用~
and ^
,not >=
or <
)https://nodesource.com/blog/semver-tilde-and-caret。
poetry
使用 python 运行,但不适用于旧版本的 python。因此,要为旧版本的 python 开发:一些命令必须在pyenv
设置为 >3.6 的情况下运行,但随后pyenv
需要切换回旧版本来创建 venv。看来 venvs 必须大于 3.5。
https://github.com/sdispater/poetry/issues/1223
也不确定 Windows 的兼容性poetry
。
poetry
对我来说,和之间的主要区别pipenv
在于它们的用法pyenv
和直接发布到PyPi
. 还缺少poetry
我个人觉得令人沮丧的脚本。
我发现在使用时poetry
,使用pyenv
. 虽然目前这可以通过使用本地安装 venv 来缓解。我知道这限制了我在不同 python 环境中快速测试我的代码的能力,但是还有其他工具tox
可以做到这一点。
发布到PyPi
使用poetry
是如此简单,我用一行(上图)解释了它。发布到PyPi
withpipenv
是一个雷区,为了解释它,我必须链接到整个 git repo(上图)。