我不是普通的虚拟环境用户。我只是习惯在用户级别安装 pip 包,例如
python3 -m pip install --user tensorflow
并与之合作。这也是安装我的 jupyter 实验室以及使用 ipython 笔记本的方法。
但直到最近,我才养成了通过创建虚拟环境在项目级别安装 pip 包的习惯
python3 -m venv .venv
source .venv/bin/activate
(.venv)$ python3 -m pip install tensorflow # Within the virtual environment, example
即使在虚拟环境中,每当我跑步时
(.venv) $ jupyter notebook
它会启动,无需在环境中显式安装 jupyter 。所以它几乎看起来像是不知何故 jupyter 是从我的用户级包继承的。但是,在环境中,当我尝试这些
(.venv) $ python3 -m pip freeze # Empty, no package
(.venv) $ python3
>>> import tensorflow # Module not found, as tf exists only in the base environment
那么,这是怎么回事?如果.venv
提供了与基础的真正隔离(因为tensorflow似乎没有从基础继承),它为什么会继承jupyter?平台(如果相关)
jupyter
时,shell 会在
$PATH
中查找它。激活的虚拟环境将其
.venv/bin
前置到
$PATH
(这实际上几乎是
.venv/bin/activate
的全部功能,其他所有内容都在 Python 解释器内实现)。如果在当前虚拟环境 shell 中找不到
jupyter
,则在其他目录中搜索它。一旦找到 shell 就会执行它。这里没什么特别的。更奇特的部分是:
jupyter
是一个带有a shebang的脚本,因此它运行与当前虚拟环境不同的Python解释器,并且Python解释器从不同的
site-packages
导入模块。我希望这能解释。要找出
jupyter
在哪里:
which jupyter
找出它的shebang:
head -1 `which jupyter`