在具有不同依赖关系的python项目环境之间自动切换

时间:2019-02-07 10:13:11

标签: python npm pip

我正在使用相同库的不同版本的不同python项目中工作。当我使用pip安装库时,它们是全局安装的,并且是单个版本。我知道拥有同一个库的不同版本的唯一方法是为每个项目创建一个conda环境。但是,当我同时处理多个项目时,始终在环境之间切换会变得有些烦人。

我习惯了npm,其中每个节点项目都有自己的node_modules目录,该目录本质上创建了一个虚拟环境,而无需显式创建和切换环境。有没有办法获得类似于python中npm的工作流程?明确为每个项目创建一个conda环境是python中的最佳选择吗?如果是这样,是否有任何通用工具或脚本来改进此工作流程? (例如,Python是否有package.jsonnpm install的等效项?)

1 个答案:

答案 0 :(得分:3)

实际上,Python几乎完全相同:Pipenv

Pipenv是virtualenv的包装。 virtualenv是Python的虚拟安装,安装了特定的依赖项,只有在需要时才可以激活它。

您可以从pip安装Pipenv:

$ pip install --user pipenv

要使用Pipenv,您可以通过指定Python版本在现有目录中对其进行初始化:

~/project$ pipenv --python 3.5
Creating a virtualenv for this project…
Pipfile: ~/project/Pipfile
Using /usr/local/bin/python3.5 (3.5.6) to create virtualenv…
⠴Running virtualenv with interpreter /usr/local/bin/python3.5
Using base prefix '/usr/local'
New python executable in ~/.local/share/virtualenvs/project-FR7x7nea/bin/python3.5
Also creating executable in ~/.local/share/virtualenvs/project-FR7x7nea/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: ~/.local/share/virtualenvs/project-FR7x7nea
Creating a Pipfile for this project…

这将创建一个名为Pipfile的文件,该文件将保留您的依赖关系。 看起来像这样:

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]

[dev-packages]

[requires]
python_version = "3.5"

您可以使用pipenv install安装依赖项,就像使用pip那样:

pipenv install numpy

这会将其添加到您的Pipfile中,并将其版本冻结在Pipfile.lock中。 您应该始终通过pipenv命令来管理依赖项,而不是手动编辑这些文件。

此外,您可以将requirements.txt文件传递给pipenv,其作用与pip相同。 requirements.txt文件是使用pip时的标准文件; Pipenv希望使用这种格式。 例如,以下是有效的最小requirements.txt

docopt

这仅表示您希望使用任何版本的docopt。 如果您需要依赖项的特定版本,请pip supports this as well。 使用pipenv install标志将其传递给-r

~/project$ pipenv install -r requirements.txt
Requirements file provided! Importing into Pipfile…
Pipfile.lock (c2e94e) out of date, updating to (5a67c1)…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (c2e94e)!
Installing dependencies from Pipfile.lock (c2e94e)…
     ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 2/2 — 00:00:02
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.

最后,您必须激活Pipenv包装的虚拟环境,才能有效访问依赖项。 这是通过pipenv shell完成的(尽管您可以使用pipenv run <cmd>执行单个命令):

~/project $ pipenv shell
(project) ~/project$ python
Python 3.5.6 (default, Dec  3 2018, 12:12:20) 
[GCC 8.2.1 20180831] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>>

这样做的好处是,您可以从Github克隆一个随机存储库,初始化Pipenv,然后运行pipenv install -r requirements.txt以准备一个干净的环境来运行该项目(这里的警告是下载所有依赖项)可能需要一些时间)。 依赖项将仅安装在虚拟环境中,以保持其他虚拟环境和主机环境的清洁。

此处提供更多见解:https://docs.python-guide.org/dev/virtualenvs/