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