VS Code 远程连接服务器:Anaconda 环境与 Python/Jupyter 运行全指南
在使用 VS Code 通过 SSH 远程连接到服务器进行开发时,尤其是在进行深度学习等需要特定环境的工作时,正确配置和使用 Anaconda 环境以及理解不同的代码运行方式非常关键。本文将梳理在 VS Code 远程连接环境下,如何管理 Anaconda 环境并运行 Python 代码(包括 .py
文件和 .ipynb
文件)。
我的环境 setup
- 本地: Visual Studio Code
- 远程服务器: 通过 VS Code Remote-SSH 连接
- 服务器软件: 安装了 Anaconda
- Anaconda 环境: 创建了名为
pytorch_env
的虚拟环境,用于深度学习。 - VS Code 插件: 在远程服务器上安装了 VS Code 的 Python 插件和 Jupyter 相关插件。
Anaconda 环境与 Jupyter
远程服务器上安装 Anaconda 后,默认的 base
环境通常会直接包含 Jupyter Notebook 和 JupyterLab。但是,我们自己创建的虚拟环境(例如 pytorch_env
)默认是“干净”的,不包含 Jupyter 相关组件。
为了在特定的虚拟环境(如 pytorch_env
)中使用 Jupyter 的功能(包括在 VS Code 中运行 .ipynb
文件或使用交互式窗口),我们需要在这个环境中安装必要的库。
核心需求:在 pytorch_env
环境下使用 Jupyter 内核
步骤如下:
-
激活
pytorch_env
环境:
打开 VS Code 的集成终端(确保它连接的是你的远程服务器),然后执行:conda activate pytorch_env
-
在该环境下安装
ipykernel
:
ipykernel
是连接 Jupyter 和 Python 环境的关键库。在已经激活pytorch_env
的终端中执行:pip install ipykernel
-
设置该环境为 Jupyter 内核(可选但推荐):
安装ipykernel
通常会自动注册内核,但手动执行可以确保 VS Code 和 Jupyter 能够识别这个环境。在激活pytorch_env
的终端中执行:python -m ipykernel install --user --name=pytorch_env --display-name="PyTorch Env (pytorch_env)"
这里的
--display-name
是你在 VS Code 的内核列表中看到的环境名称,可以根据喜好设置。
完成以上步骤后,你的 pytorch_env
环境就已经具备了作为 Jupyter 内核的能力。
在 VS Code 中选择 Jupyter 内核
现在,当你新建或打开一个 .ipynb
文件时,VS Code 会提示你选择一个内核。
选择内核时,你会看到类似这样的选项:
正确的选择是点击 “Python 环境…”。
点击后,VS Code 会列出它在远程服务器上检测到的所有 Python 环境(包括 base
和你创建的 pytorch_env
)。你应该在列表中找到并选择你的 pytorch_env
。
这样做的好处是,你不需要手动在服务器上运行 jupyter notebook
或 jupyter lab
命令来启动一个完整的 Jupyter Server。VS Code 会利用你选择的具备 ipykernel
的 Python 环境,在后台为你处理启动和管理 Jupyter 内核的底层细节。
不要选择“现有 Jupyter 服务器…”,那个选项用于连接一个已经在服务器上独立运行起来的 Jupyter Server 实例,通常需要你手动启动该服务器并提供 URL 和 Token。
选择好 pytorch_env
内核后,你就可以在 .ipynb
文件中编写和运行代码了。
理解不同的 Python 代码运行方式
除了在 .ipynb
文件中运行,VS Code 还提供了其他运行 Python 代码的方式。理解它们的区别,特别是它们与 Jupyter 的关系,有助于选择最适合当前任务的方式。
首先明确一点:无论采用哪种方式,你的代码最终都是由服务器上的 Python 解释器(特别是来自你指定的 Conda 环境,如 pytorch_env
)来执行的。区别在于运行时的界面、执行模式和工作目录。
1. 在终端上运行 Python 文件(.py
)
- 模式: 这是最传统、标准的 Python 脚本执行模式。
- 过程:
- 你打开一个终端(可以是 VS Code 的集成终端,也可以是直接通过 SSH 连接的终端)。
- 激活你的目标环境(例如:
conda activate pytorch_env
)。 - 输入命令
python your_script_name.py
来运行整个.py
文件。
- 执行: 代码会从
.py
文件的第一行开始,一直执行到最后,是一次性的、线性的过程。 - 输出: 所有通过
print()
打印的内容会显示在终端窗口中。 - 交互性: 非常低。代码执行过程中你通常无法方便地暂停、查看中间变量的值或分步执行。
- 工作目录: 通常是你执行
python
命令时,终端所在的那个目录。这是导致相对文件路径问题的一个常见原因。 - 与 Jupyter 的关系: 这不是在 Jupyter 上运行。 这仅仅是使用指定的 Python 解释器来执行一个普通的 Python 脚本。
2. 在交互式窗口中运行(配合 .py
文件使用)
- 模式: 这是 VS Code 提供的一种类似 Jupyter Notebook 的交互式代码执行模式,但你的代码仍然保存在标准的
.py
文件中。 - 过程:
- 你打开一个
.py
文件。 - 可以在文件中使用
# %%
等标记将代码划分为不同的块(被称为“代码 cell”)。 - 点击代码块旁边的“运行 cell”按钮。
- VS Code 会自动启动或连接到一个独立的“Python 交互式”窗口。
- 你打开一个
- 执行: 你可以灵活地选择文件中的某一个或某几个代码块进行执行。代码的执行状态(如定义的变量、函数定义等)会在整个交互式窗口的会话期间保持。
- 输出:
print
的内容、代码的返回值、甚至 Matplotlib 绘制的图表会直接显示在交互式窗口中,通常是代码块的下方,而不是在终端。 - 交互性: 很高。非常适合在开发过程中进行探索、测试、调试和查看中间结果。
- 工作目录: 通常默认为
.py
文件所在的目录(但这有时可以在 VS Code 设置中进行配置)。这是导致相对路径问题在终端和交互式窗口表现不同的原因之一。 - 与 Jupyter 的关系: 底层使用了 Jupyter 的技术,特别是 Jupyter 内核。 VS Code 在后台启动一个 Jupyter 内核(基于你选择的 Python 环境)来管理和执行交互式窗口中的代码。你可以认为它是在 VS Code 这个界面下,由
.py
文件内容驱动的一种“Jupyter 体验”。
3. 在 Jupyter Notebook(.ipynb
)中运行
- 模式: 这是 Jupyter 平台最经典的原生交互式文档模式。文件本身(
.ipynb
)就包含了代码、代码输出、以及使用 Markdown 编写的文本和说明。 - 过程:
- 你打开一个
.ipynb
文件。 - VS Code 会以 Notebook 界面打开它。
- 你需要选择一个 Jupyter 内核(也就是一个安装了
ipykernel
的 Python 环境)来运行这个 Notebook。
- 你打开一个
- 执行: 代码被组织在不同的 cell 中,你可以逐个运行 cell。代码的执行状态在整个 Notebook 会话期间保持。
- 输出: 代码输出、图表、甚至 HTML 等富文本内容会直接显示在对应的代码 cell 下方,并会与 Notebook 文件内容一起保存。
- 交互性: 非常高。是专为交互式探索、数据分析和结合代码与文档进行演示而设计的。
- 工作目录: 通常是
.ipynb
文件所在的目录。 - 与 Jupyter 的关系: 这就是在 Jupyter 上运行。 VS Code 在这里充当了 Jupyter 的一个功能强大的客户端界面。
因此在终端上运行Python文件和在交互式窗口运行Python文件时他们的工作目录不同,因此使用相对路径无法同时在这两个模式下运行。要运行的话得改成绝对路径
解决终端环境显示异常 (pytorch_env) (base)
你提到在终端中看到了类似 (pytorch_env) (base)
这样的提示,这表明可能出现了环境嵌套或环境变量混淆的情况。这不是正常现象,通常终端提示符应该只显示一个当前激活的环境名称(例如 (pytorch_env)
或 (base)
)。
让我们来修复这个问题:
-
退出所有 Conda 环境:
连续执行conda deactivate
命令,直到终端提示符不再显示任何环境名称为止。通常执行两次conda deactivate
就够了,因为conda deactivate
只退出最内层的环境。conda deactivate conda deactivate
(根据实际情况可能需要执行更多次)
-
重新激活你想要使用的环境:
例如,重新激活pytorch_env
:conda activate pytorch_env
此时,终端提示符应该只显示
(pytorch_env)
。
如果这个问题经常发生,可能是你的 shell 配置文件(如 ~/.bashrc
, ~/.zshrc
等)中有重复的环境激活或 Conda 初始化设置。可以检查这些文件,确保 conda init
只被执行一次,并且没有其他代码会导致环境意外激活。
知识点总结
- 远程服务器中安装 Anaconda 后,默认的
base
环境通常会直接包含了jupyter notebook
、jupyter lab
和ipykernel
等库。 - 你自己使用
conda create
创建的新环境默认是最小化的,不自动包含 Jupyter 相关库(特别是ipykernel
)。 - 要在自定义环境中利用 Jupyter 功能(Notebook 或交互式窗口),核心是确保该环境中安装了
ipykernel
。 - VS Code 远程连接时,通过选择正确的 Python 环境(安装了
ipykernel
的环境),可以直接利用该环境作为 Jupyter 内核,无需手动启动完整的 Jupyter Server。
总结与选择
- 在终端运行
.py
: 标准 Python 脚本执行 (不是 Jupyter)。适用于最终运行、自动化。 - 在交互式窗口运行
.py
: 利用了 Jupyter 内核的能力,在 VS Code 中提供类似 Notebook 的交互体验,代码仍在.py
文件中。适用于开发、调试。 - 在 VS Code 中运行
.ipynb
: VS Code 提供了原生的 Jupyter Notebook 功能和界面,这就是在 Jupyter 上进行操作。适用于探索、文档、结合代码与输出。
你可以根据当前所处的开发阶段和需求,选择最适合的运行方式。在 VS Code 中进行深度学习开发,通常建议优先使用 .ipynb
文件或 .py
文件配合交互式窗口,以利用其强大的交互和可视化能力。