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
文件配合交互式窗口,以利用其強大的交互和可視化能力。