不为不同的venv环境单独安装Python包

时间:2017-11-01 04:21:26

标签: python python-3.x virtualenv jupyter-notebook jupyter

TL; DR
想用不同的python设置运行Jupyter笔记本。 Python包总是全局安装。不明白为什么。 \ TL; DR

我想使用venv运行具有不同python设置的Jupyter笔记本。请参阅此处查看official documentation

我的系统上已经安装了Python 3.6

$ python --version
Python 3.6.1 :: Continuum Analytics, Inc.

使用以下命令创建了两个虚拟环境:

$ python3 -m venv --without-pip Documents/venv/test01
$ python3 -m venv --without-pip Documents/venv/test02

guide之后,我尝试使用

为每个笔记本设置不同的内核
$ source activate test01
(Documents/venv/test02) $ python -m ipykernel install --user --name test01 --display-name test01

但是,第二个命令失败并带有

/Users/dominik/Documents/venv/test02/bin/python: No module named ipykernel

所以,我取消了我的venv并在venv外面运行了相同的命令

$ source deactivate test01
$ python -m ipykernel install --user --name test01 --display-name test01
$ python -m ipykernel install --user --name test02 --display-name test02

在我的Jupyter笔记本中,我现在可以看到不同的内核: new kernels available

现在我正在使用test01内核创建一个新的笔记本。在笔记本内部,我尝试添加一个默认情况下在Python中不可用的模块:

$ import mord
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-2-a00d777a7e47> in <module>()
----> 1 import mord

ModuleNotFoundError: No module named 'mord'

这是预期的。然后我使用pip

将该软件包安装到我的test01环境中
$ source activate Documents/venv/test01
(Documents/venv/test01) $ pip install mord

重新启动test01内核后导入错误消失 - 正如预期的那样。但是 - 现在这是我的问题 - 当我在import mord笔记本上test02打包时,也没有导入错误。为什么?

我希望只为mord安装test01个包。但是,它似乎是全球安装的。

查看venv文件夹,它显示没有特别添加到这些项目 venv folders

pyvenv.cfg文件似乎也没有改变。

home = /Users/dominik/anaconda/bin
include-system-site-packages = false
version = 3.6.1

任何人都可以给我一些指示我做错了吗?

2 个答案:

答案 0 :(得分:1)

因为您使用--without-pip标志创建了virtualenv,虚拟环境中没有pip可执行文件,您使用系统pip来安装软件包。

基本上,虚拟环境不涉及您的设置,即使有两个内核规范,它们都是在virtualenv停用的情况下创建的。

设置步骤建议:创建不带--without-pip选项的virtualenv;为每个虚拟环境安装ipykernel,这意味着,在virtualenv激活时安装;从相应的virtualenv创建内核规范。

答案 1 :(得分:0)

在georgexsh指出我关于--without-pip旗帜的正确方向之后,我就是这样解决的:

创建两个虚拟环境

$ python -m venv --without-pip Documents/venv/test01
$ python -m venv --without-pip Documents/venv/test02

我仍在使用--without-pip标志,因为该命令会产生错误消息

对每个环境test01test02执行以下步骤:

激活虚拟环境并手动安装pip

$ source Documents/venv/test01/bin/activate
(test01) $ curl https://bootstrap.pypa.io/get-pip.py | python

在虚拟环境中安装并运行Jupyter

(test01) $ pip install jupyter
(test01) $ jupyter notebook

在完成上述两个环境的步骤后,我测试了仅在其中一个环境中安装软件包

首先激活您要安装的环境(如果尚未激活)

$ source Documents/venv/test01/bin/activate
(test01) $ pip install numpy

numpy包现在仅适用于test01环境中安装的Jupyter版本。

如果发现每个环境安装一个专用内核是可选的(为了我的目的)。无论如何,这是在激活的环境中运行的步骤:

(test01) $ pip install ipykernel
(test01) $ python -m ipykernel install --user --name test01 --display-name test01

现在,在Jupyter中,您还可以创建具有不同内核类型的笔记本。