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

为python项目自动切换具有不同依赖关系的环境,python,npm,pip,Python,Npm,Pip,我正在处理使用同一库的不同版本的不同python项目。当我使用pip安装库时,它们是全局安装的,并且是单一版本。据我所知,拥有同一个库的不同版本的唯一方法是为每个项目创建一个conda环境。然而,当我同时处理许多项目时,总是在环境之间切换会变得有点烦人 我习惯了npm,每个节点项目都有自己的node\u modules目录,基本上创建了一个虚拟环境,而不必显式地创建和切换环境。有没有一种方法可以获得类似于python中npm的工作流?为每个项目显式创建conda环境是python中的最佳选项吗?

我正在处理使用同一库的不同版本的不同python项目。当我使用pip安装库时,它们是全局安装的,并且是单一版本。据我所知,拥有同一个库的不同版本的唯一方法是为每个项目创建一个conda环境。然而,当我同时处理许多项目时,总是在环境之间切换会变得有点烦人


我习惯了npm,每个节点项目都有自己的
node\u modules
目录,基本上创建了一个虚拟环境,而不必显式地创建和切换环境。有没有一种方法可以获得类似于python中npm的工作流?为每个项目显式创建conda环境是python中的最佳选项吗?如果有,是否有任何通用工具或脚本来改进此工作流?(例如,python是否有与
package.json
npm install
相当的版本?

事实上,python的版本几乎完全相同:

Pipenv是一个包装器。 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
具有相同的效果。 使用pip时,
requirements.txt
文件是标准文件;Pipenv希望有一个符合此格式的。 例如,以下是有效的最小
requirements.txt

docopt
它只是意味着您需要任何版本的
docopt
。 如果您需要依赖项的特定版本。 使用
-r
标志将其传递给
pipenv安装

~/project$pipenv安装-r requirements.txt
要求文件提供!正在导入文件…
Pipfile.lock(c2e94e)已过期,正在更新为(5a67c1)…
正在锁定[开发包]依赖项…
正在锁定[程序包]依赖项…
更新了Pipfile.lock(c2e94e)!
正在从Pipfile.lock(c2e94e)安装依赖项…