npm
的主要功能与pip
,pipenv
和poetry
包管理器相比如何?以及如何使用pipenv
或poetry
的那些功能?
这主要可以帮助某人从JavaScript开发人员过渡到python开发人员。
我从未使用过rubygems,但将其主要功能与主要的python软件包管理器进行比较可能也很有用。帮助任何来自红宝石背景的人。
| 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
发布,请参见下文。免责声明:我仅在'NIX系统(尤其是OSX)上具有这些软件包管理器的经验,pipenv
本身将Windows视为头等公民,因此我不知道如果没有pyenv
它将如何工作?据我所知在Windows上不可用。
为了充分利用pipenv
,应安装pyenv
。 pipenv
将能够检测并使用随pyenv
一起安装的任何版本的python,即使未激活也是如此。例如,如果Pipfile
已列出python 3.4作为要求:要成功运行pipenv install
,应首先运行pyenv install 3.4.0
。
创建一个新的venv(使用python 3.7.x)和Pipfile
:
>>> pipenv --python 3.7
或从现有的Pipfile.lock
安装依赖项,请使用以下命令。此命令还可用于创建Pipfile
和venv(默认为最新的可用python版本)。
>>> pipenv install
要在创建的venv中运行命令:
>>> pipenv run <script or command>
例如
>>> pipenv run python main.py
诗歌仍然使用pyenv
,但以不同的方式:在调用poetry install
或poetry run
之前,必须激活您要使用的python版本。
A 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>
如果我们使用pyenv
更改全局python版本,我们将不再能够在创建的venv中运行命令。如果我们使用本地创建的venv,则有例外,请参见下文。
有时,最好检查您的代码在python 3.7和python 3.4上都可以使用。这不是我们可以理所当然的事情。
仅可通过使用其他python版本重新创建venv来删除它:
>>> rm -rf <path to venv>
>>> pipenv --python <different python version>
警告可能会显示venv的python版本与Pipfile
中指定的版本不匹配,但据我所知这仅仅是警告。
https://github.com/pypa/pipenv/issues/1071
诗歌更适合此用例:可以并排创建多个venv。要使用pyenv
创建和使用新的venv开关python版本,然后创建一个新的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
最好是能够发布到PyPi而不制作其他setup.py
文件,如果发布包所需的所有信息都包含在包管理文件中,则有可能。
据我所知,这是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存储库:
https://github.com/alanbacon/pipenvExample
使用诗歌出版您的包裹真的很容易,您根本不需要setup.py
文件。只需运行:
>>> poetry publish [--build] [--username <username>] [--password <password>]
发布的软件包可以使用
pip
进行安装,而不仅仅是poetry
的其他实例。
有关如何从使用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和软件包的版本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
也不确定poetry
的Windows兼容性。>
对我而言,poetry
和pipenv
之间的主要区别在于pyenv
的用法以及它们直接向PyPi
发布的能力(或缺乏)。 poetry
中也缺少脚本,我个人觉得很沮丧。
[我发现使用poetry
时在使用pyenv
的python环境之间有更多的切换。尽管当前可以通过使用本地安装venv来缓解这种情况。我知道这限制了我在不同的python环境中快速测试代码的能力,但是还有其他工具,例如tox
。
使用PyPi
发布到poetry
非常简单,我在一行中进行了解释(上)。用PyPi
发布到pipenv
是一个雷区,要说明一下,我不得不链接到整个git repo(上方)。