VS Code 远程连接服务器:从环境配置到代码运行与常见问题解决实录
在使用 VS Code 通过 Remote-SSH 连接到远程服务器进行 Python 开发,特别是涉及 Anaconda 环境和深度学习项目时,可能会遇到各种各样的问题。本文记录并解答了我在配置和运行代码过程中遇到的一系列具体问题,希望能为你提供参考。
我的基础环境如下:
- 本地: Visual Studio Code
- 远程服务器: Linux 系统,通过 VS Code Remote-SSH 连接
- 服务器软件: 安装了 Anaconda
- Anaconda 环境: 创建了名为
pytorch_env
的虚拟环境,用于深度学习。 - VS Code 插件: 在远程服务器上安装了 VS Code 的 Python 插件和 Jupyter 相关插件。
问题一:我的深度学习代码是写在 .py
文件里的,应该用 Python 直接运行还是在 Jupyter 上运行?
解答:
对于深度学习代码的开发和实验阶段,强烈推荐在 Jupyter Notebook (.ipynb) 或 VS Code 的交互式窗口 (.py 文件配合) 上运行。
- Jupyter Notebook (.ipynb): 提供完整的单元格执行、内联输出、图表显示和文本说明功能,非常适合探索性编程、数据可视化和记录实验过程。
- VS Code 交互式窗口 (.py 配合): 允许你在
.py
文件中分块运行代码,并在独立的窗口中看到输出和图表,提供了类似 Notebook 的交互性,同时保持代码在.py
文件中。 - 纯 Python 脚本 (.py 在终端运行): 更适合于代码开发完成后的最终训练、批量处理、自动化或集成到其他应用中。
选择哪种方式取决于你的当前任务阶段。开发调试优先考虑交互式方式。
问题二:如果想在 Jupyter 上运行,远程服务器上有 Jupyter 吗?应该在哪个环境下运行?
解答:
- 服务器上是否有 Jupyter: 如果你在服务器上安装了 Anaconda,通常
base
环境会自带 Jupyter Notebook 和 Jupyter Lab。但是,你的深度学习代码依赖于pytorch_env
环境中的库(如 PyTorch),所以你必须在pytorch_env
环境中运行代码。 - 在
pytorch_env
中使用 Jupyter: 即使base
环境有 Jupyter,pytorch_env
作为一个独立的环境,默认是没有的。你需要在这个环境中安装ipykernel
库,才能让 Jupyter(或 VS Code 的 Jupyter 功能)将pytorch_env
识别为一个可用的内核。
在 pytorch_env
环境中设置 Jupyter 内核的步骤:
- 打开 VS Code 集成终端,连接到远程服务器。
- 激活环境:
conda activate pytorch_env
- 安装
ipykernel
:pip install ipykernel
- 注册内核(可选但推荐):
python -m ipykernel install --user --name=pytorch_env --display-name="PyTorch Env (pytorch_env)"
完成这些步骤后,pytorch_env
就具备了作为 Jupyter 内核的能力。
问题三:在 VS Code 中运行 .ipynb
文件时,如何选择正确的 pytorch_env
内核?
解答:
在你连接到远程服务器的 VS Code 中打开 .ipynb
文件后:
- VS Code 会在 Notebook 界面的右上角或底部状态栏显示当前选择的 Python 环境/内核。如果未选择,会提示你选择。
- 点击显示内核名称的位置(可能显示为默认环境或“选择内核”)。在我的环境中,它可能显示为 或 。
- 点击后会弹出内核选择菜单,看到类似这样的选项:
- 务必选择 “Python 环境…”。
- 在弹出的列表中,找到并选择你的远程服务器上的
pytorch_env
环境。
重要: 不要选择“现有 Jupyter 服务器…”,那个选项是连接一个已经独立运行起来的 Jupyter Server,而不是利用 VS Code 自动管理的环境内核。选择“Python 环境…”让 VS Code 利用你的 pytorch_env
在后台启动内核。
问题四:我的 .py
文件如何运行?
解答:
对于 .py
文件,同样需要确保使用 pytorch_env
环境中的 Python 解释器来执行。
- 在 VS Code 中设置项目的 Python 解释器: 在 VS Code 连接到远程服务器的状态下,打开你的
.py
文件。查看 VS Code 左下角的状态栏,它会显示当前选择的 Python 解释器。点击它,选择你的远程服务器上的pytorch_env
解释器(通常显示为Python X.x.x ('pytorch_env': conda)
)。 - 运行
.py
文件: 设置好解释器后,有几种运行方式:- 点击
.py
文件编辑器右上角的绿色“运行”按钮 ▶。 - 右键点击代码编辑区域,选择“在终端中运行 Python 文件”。
- 打开 VS Code 集成终端(通常会自动激活选定的环境),手动输入
python your_script_name.py
。
- 点击
问题五:运行代码时报错 ModuleNotFoundError: No module named 'pandas'
?
解答:
这个错误表明你的代码依赖的 pandas
库在当前执行代码的 Python 环境中没有安装。
原因: Anaconda base
环境默认包含很多库,但你新建的 pytorch_env
环境是相对干净的,不会自动包含所有库,除非你在创建或后续安装时指定了。即使 base
有 pandas,pytorch_env
也可能没有。
解决: 在你的 pytorch_env
环境中安装 pandas。
- 打开 VS Code 集成终端,连接到远程服务器。
- 激活环境:
conda activate pytorch_env
- 安装 pandas:
conda install pandas
或pip install pandas
- 安装完成后,确保在
pytorch_env
中再次运行代码。
问题六:安装 pandas 后,运行代码又报错 AssertionError: dataset does not exist
?
解答:
这个错误表示你的代码尝试打开一个文件,但根据提供的路径找不到该文件。错误发生在加载数据集的代码处,路径是 ./pytorch-nn/iris.txt
。
原因: ./pytorch-nn/iris.txt
是一个相对路径,它的实际位置取决于程序运行时的“当前工作目录”。交互式窗口和终端运行时的默认工作目录可能不同,导致相对路径解析结果不同。
解决: 修改代码中使用文件路径的地方。
推荐使用文件的绝对路径: 找到 iris.txt
在服务器上的完整路径(例如 /home/user/project/data/iris.txt
),然后在代码中直接使用这个完整路径。这样无论从哪里运行脚本都能找到文件。
或者,如果继续使用相对路径,需要确保运行时的工作目录是正确的,并且代码中的相对路径是相对于这个工作目录的。但绝对路径更不容易出错。
问题七:修复文件路径后,运行代码又进入 TypeError: unsupported format string passed to Tensor.__format__
和 AttributeError: 'float' object has no attribute 'item'
的循环报错?
解答:
这两个错误都与你在打印训练过程中的 Tensor 变量有关(例如 loss, accuracy)。
TypeError: unsupported format string passed to Tensor.__format__
: 这是因为你试图用:.3f
这样的标准字符串格式符直接格式化一个 PyTorch 的 Tensor 对象。Tensor 不支持这种直接格式化。AttributeError: 'float' object has no attribute 'item'
: 这是因为你尝试在一个标准的 Pythonfloat
浮点数上调用.item()
方法。标准的 float 没有.item()
方法。
这两个错误来回出现,说明你用于打印的变量(如 loss, train_acc, val_acc)有时是 Tensor,有时已经被转换为 float。
解决: 在打印这些变量时,使用 float()
函数来获取其数值。float()
既可以处理包含单个数值的 Tensor,也可以处理标准的 float。
将你的打印语句(通常在训练循环中)修改为类似这样:
print("train epoch{}/{}/ loss::{:.3f} train_acc::{:.3f} val_acc::{:.3f}".format(epoch + 1, epochs, float(loss), float(train_acc), float(val_acc)))
(确保对所有 Tensor 或可能是 Tensor 的变量使用 float()
)
问题八:为什么在交互式窗口运行成功了,但在终端上运行 .py
文件又出现之前的 AssertionError: dataset does not exist
?
解答:
这个问题再次指向了文件路径和运行时的当前工作目录的区别。虽然你在交互式窗口成功运行,但当你切换到终端手动运行 .py
文件时,终端的默认工作目录很可能与交互式窗口的不同。
- 交互式窗口/
.ipynb
: 工作目录通常默认是文件所在的目录。 - 终端运行: 工作目录是你执行
python
命令时所在的目录。
如果你的代码使用了相对路径(例如 ./data/file.txt
),这个相对路径会根据当前工作目录来解析。不同的工作目录会导致同一个相对路径解析到不同的实际位置,如果文件不在那里就会报错。
解决: 回到问题六的解答,最稳妥的方式是在代码中使用数据文件的绝对路径,这样就不会受到运行目录的影响。或者,确保你在终端运行脚本时,先 cd
到正确的目录(通常是脚本所在的目录或者数据文件所在的目录),再执行 python your_script.py
。
问题九:我终端没激活虚拟环境,终端提示 Python 版本为 2.7,那我直接在终端运行 Python 文件,调用的是哪个解释器?
解答:
在终端未激活任何 Conda 环境时,终端提示符显示 Python 2.7.17
表明:在你当前的 shell PATH
环境变量下,当你输入 python
命令时,shell 第一个找到的可执行文件是属于 Python 2.7.17
版本的。
在这种状态下,如果你直接输入 python your_script.py
来运行文件,调用的就是那个 Python 2.7.17
解释器。 这会导致依赖 Python 3 和特定库的代码出错。
要使用 pytorch_env
环境中的解释器,你需要:
- 激活环境:
conda activate pytorch_env
然后python your_script.py
。 - 直接指定解释器路径:
/newdata/home/liangweitang/anaconda3/envs/pytorch_env/bin/python your_script_name.py
(如问题十所述)。
问题十:为什么我没激活虚拟环境,但终端显示自动执行了 /full/path/to/pytorch_env/bin/python ...
这样的命令,并且成功运行了?
解答:
这条完整的命令 (/newdata/home/liangweitang/anaconda3/envs/pytorch_env/bin/python /newdata/home/liangweitang/python-test/pytorch-nn/nn.py
) 不是你自己手动输入的,而是当你从 VS Code 界面(例如点击 .py
文件右上角的运行按钮或右键菜单中的“在终端中运行 Python 文件”)运行脚本时,VS Code 自动为你构建并在终端中执行的命令。
原因: 这是 VS Code Python 扩展的一个便捷功能。因为你在 VS Code 中已经将项目的 Python 解释器设置为了 pytorch_env
,所以当你通过 VS Code 的运行功能执行脚本时,VS Code 会查找这个设置,获取到 pytorch_env
解释器的完整路径,然后构建出包含解释器完整路径的命令并发送到终端执行。
所以,即使终端本身没有手动激活环境,VS Code 也确保了脚本是使用了你指定的 pytorch_env
解释器来运行的,从而绕过了终端当前的 PATH
设置。
总结
通过 VS Code 远程连接进行 Python 开发,核心在于正确管理和使用不同的 Python 环境(尤其是 Conda 环境)。理解终端激活、VS Code 解释器选择、以及不同运行模式(终端 .py
、交互式 .py
、.ipynb
)的工作原理和它们对文件路径、库查找的影响,是解决大多数环境和运行问题的关键。掌握在正确环境中安装库(如 ipykernel
, pandas
)以及处理好文件路径问题,就能更顺畅地进行远程开发。