## 0. 基础
在讨论 IPython 的内核与环境之间的关系时,我们需要明确两个概念:IPython 内核(Kernel)和 Python 环境(Environment)。
1. **IPython 内核(Kernel)**:
- IPython 内核是 IPython 项目的一部分,它是一个交互式的 Python 解释器。
- 内核负责运行用户代码,计算表达式的结果,并返回输出。
- Jupyter笔记本与IPython内核通信以执行代码单元。
- 一个Jupyter笔记本可以连接到不同的内核,比如 Python, R, Julia 等。
- 内核运行在一个进程中,并且可以与多个前端(比如 Jupyter Notebook 或 JupyterLab)通信。
2. **Python 环境(Environment)**:
- Python 环境是指一个特定的安装,其中包括了 Python 解释器本身以及一系列安装的包和模块。
- 环境通常由虚拟环境管理,比如使用 `venv` 或 `conda` 创建的环境,使得不同项目可以有不同的依赖而不会发生冲突。
- 每个环境都有自己的安装路径,包括独立的 Python 二进制文件和库。
IPython 内核与 Python 环境之间的关系是:
- 当一个内核被启动时,它是在一个特定的 Python 环境下被执行的。这意味着内核具有访问该环境中安装的所有库和模块的能力。
- 一个 Jupyter 笔记本界面可以连接到不同的内核,其中每一个内核都可以在不同的 Python 环境中运行。这允许用户在同一浏览器窗口中访问多个环境。
- 你可以有多个内核配置,每个都指向不同的 Python 环境。例如,你可能有一个基于 Python 3.7 的环境的内核和另一个基于 Python 3.9 的环境的内核。
使用Jupyter笔记本时,可以通过切换内核来在不同的环境之间进行切换。例如,如果你正在一个 Jupyter 笔记本中使用特定版本的 Python 或者一个专门的库,你可以通过选择对应环境的内核来确保你的笔记本在正确的上下文中运行。
总体来说,内核负责代码的执行,而环境定义了执行代码时可以访问的资源(Python 版本、库、模块等)。
通过灵活配置内核和环境,我们可以为不同的项目和需求创建高度定制的代码执行环境。
## 1. 创建某虚拟环境下的IPython内核
要在特定环境中创建一个新的IPython内核,您需要执行几个步骤。这些步骤可以根据您使用的环境管理工具(如conda、virtualenv等)而有所不同。下面是使用conda和virtualenv环境作为示例的具体步骤:
1. 创建一个新的conda环境:
```python
conda create -n myenv python=3.9
```
其中 `myenv` 是环境名,`python=3.9` 指定了Python版本。
2. 激活新创建的环境:
```python
conda activate myenv
```
3. 安装ipykernel包:
```python
conda install ipykernel
```
```python
pip install ipykernel -i
https://pypi.tuna.tsinghua.edu.cn/simple
```
4. 创建一个新的内核并给它一个名字:
```python
ipython kernel install --user --name myenv --display-name "Python (myenv)"
```
- `--user` 指示Jupyter将此内核安装在用户空间。
- `--name` 后跟的是内核的标识名,通常与环境名相同。
- `--display-name` 后跟的是Jupyter笔记本列表中显示的友好名称。
```ad-note
collapse: closed
title:指示Jupyter将此内核安装在用户空间
"--user" 标志意味着Jupyter内核将被安装到当前用户的本地目录中,而不是系统级别的目录。这确保了内核安装是特定于用户的,您不需要系统管理员权限就可以进行安装或修改。这种方式也使得用户能够在没有更改其他用户或全系统设置的情况下,进行自定义和实验。
在大多数UNIX系统(包括macOS和Linux)中,这通常意味着内核配置将安装到用户的主目录下的`.local/share/jupyter/kernels/`目录中,例如`/home/username/.local/share/jupyter/kernels/`。在Windows上,它可能位于`%APPDATA%\jupyter\kernels\`中。
使用`--user`选项有以下好处:
1. **无需管理员权限**:用户可以在自己的账户下安装内核,不需要管理员权限或干预。
2. **防止干扰**:由于安装是针对单个用户的,因此不会与系统上其他用户或其他Python环境冲突。
3. **便于管理**:用户可以管理自己的内核设置,添加或删除内核,而不影响系统上的其他部分。
通过这种方式安装的Jupyter内核可以很容易地通过Jupyter Notebook或JupyterLab等工具访问和管理。
```
完成以上步骤后,您应该可以在启动Jupyter Notebook时看到新的内核选项“Python (myenv)”,可以选择它来启动Notebook以使用特定环境的库和模块。
### 使用 `base` 环境下的 Jupyter 来打开虚拟环境中的 kernel
可以使用 `base` 环境下的 Jupyter 来打开虚拟环境中的 kernel,这种方法是常见且有效的。然而,有一些需要注意的事项以避免潜在的冲突:
#### 优势
- **统一管理**: 使用 `base` 环境中的 Jupyter 管理不同虚拟环境的 kernels 可以简化你的开发环境,因为你只需维护一个 Jupyter 实例。
- **版本兼容**: 如果 `base` 环境中的 Jupyter 和虚拟环境中的库是兼容的,这种方法可以正常工作。
#### 可能的冲突和注意事项
1. **包版本不一致**:
- 如果 `base` 环境中的 Jupyter 与虚拟环境中的 Python 包版本不一致,可能会导致运行时错误或不兼容的问题。
- 确保在虚拟环境中安装的包与 `base` 环境中的 Jupyter 兼容。
2. **依赖问题**:
- 虚拟环境中的 kernel 依赖于该环境中的包。如果这些包在 `base` 环境中不可用或版本不同,可能会引发问题。
3. **路径和配置**:
- 确保虚拟环境中的 kernel 配置正确,Jupyter 能够找到并加载正确的 Python 解释器和相关包。
#### 删除某个内核
如果你希望移除之前在 `base` 环境下创建的其他虚拟环境的 IPython kernel,你可以按照以下步骤进行:
##### 1. **列出已安装的 Jupyter Kernels**
首先,列出所有已安装的 Jupyter kernels,以确定要移除的 kernel 的名称:
```bash
jupyter kernelspec list
```
这将显示已安装的 kernel 及其路径。例如:
```
Available kernels:
python3 /path/to/python3/kernel
myenv /path/to/myenv/kernel
```
##### 2. **删除指定的 IPython Kernel**
根据上一步骤中列出的 kernel 名称,使用以下命令删除你不再需要的 kernel。假设你要删除的 kernel 名称为 `myenv`:
```bash
jupyter kernelspec uninstall myenv
```
如果你想删除所有 kernels,可以重复上面的命令,替换 `myenv` 为其他需要移除的 kernel 名称。
##### 3. **重新安装新的 IPython Kernel**
如果你想在新的虚拟环境中重新安装 IPython kernel,可以激活虚拟环境并运行:
```bash
source myenv/bin/activate # macOS/Linux
myenv\Scripts\activate # Windows
pip install ipykernel
python -m ipykernel install --user --name=myenv --display-name "Python (myenv)"
```
这样,你将删除旧的 kernel,并在新的虚拟环境中正确安装和配置 IPython kernel。
## 2. 显示正在运行的IPython内核
当您使用 Jupyter Notebook 或 JupyterLab 时,它们通常会在启动时在命令行界面显示正在运行的内核。
另外,您也可以通过这些应用的用户界面查看和管理内核。
在 Jupyter Notebook 中,您可以在“Kernel”菜单下查看“Kernel Status”,并通过“Change kernel”来切换不同的内核。
在 JupyterLab 中,您可以在左侧栏中找到“Running Terminals and Kernels”视图,它提供了一个正在运行的内核和终端会话的列表,其中您可以管理它们。
您还可以使用命令行实用程序 `jupyter` 来列出正在运行的所有内核。在命令行中输入以下命令:
```bash
jupyter notebook list
```
或者对于 JupyterLab:
```bash
jupyter lab list
```
这些命令会显示所有当前打开的 Jupyter 会话以及它们的 URL。
如果您想要**低层次地查看所有正在运行的内核**,您可以查找与 `jupyter` 相关的进程。在 Unix 系统中,您可以在终端中使用 `ps` 命令配合 grep 来查找:
```bash
ps aux | grep jupyter
```
在 Windows 系统中,您可以使用任务管理器或 `tasklist` 命令来查找 Jupyter 相关的进程:
```bash
tasklist | findstr jupyter
```
注意,除了 Jupyter 环境中的内核,IPython 也可以独立于 Jupyter 作为一个交云式 Python 解释器来运行。如果您正在查找这类 IPython 实例,您同样可以用 `ps` 或 `tasklist` 命令查找 `ipython` 关键词。
为了更精确地找到 IPython 内核进程,您可以定位到由 IPython 控制的 Jupyter 内核文件,这些文件通常被储存在如下位置:
```bash
# 默认情况下,Jupyter 内核文件被存储在用户的 Jupyter 运行时目录:
jupyter --runtime-dir
```
在这个目录下,您会找到被命名为 `kernel-*.json` 的文件,这些文件包含了内核的连接信息。每个运行中的内核都会有一个对应的`.json`文件。通过查看这些文件的创建时间或修改时间,您可以知道内核启动和最后活跃的大概时间。
## 3. 如何关闭正在运行的Jupyter进程
用 `ps` 命令搜索所有包含"jupyter"的进程:
```shell
ps aux | grep jupyter
```
查找需要关闭的内核的进程ID(这通常是命令行显示结果中的一串数字,位于用户名之后)。使用以下命令终止该内核进程(其中 `PID` 是您查找到的进程ID):
```shell
kill PID
```
如果进程拒绝关闭,您可能需要强制关闭:
```shell
kill -9 PID
```
请小心使用`kill -9`,因为这会立即终止进程,可能导致未保存的数据丢失。需要注意的是,上述终止进程的方法可以关闭Jupyter的服务,但并不会停止单个内核。要停止特定内核,您可能需要找到对应的内核对话进程并关闭它。