PyCharm における SSH リモート接続を用いた開発環境の構築手順

# 背景
2ヶ月前に大学の研究室に配属され、実行環境として研究室内の高性能サーバーを提供された。

そこで実際に Python の開発、実行を何度か試してみたのだが、リモート環境での実行はローカル環境での実行と比にならないくらいしんどかったため、改善を試みることにした。

この記事が、僕のようなリモート環境初心者達の助けになれば幸いである。

まず、従来僕が行なっていたローカル環境での開発フローは以下の通りである。

## ローカル環境での開発フロー

1. ローカル環境にて PyCharm という IDE で python のソースコードを作成
1. そのまま PyCharm もしくはターミナルからソースコードを実行

---

この通り、ローカル環境では開発から実行までスムーズに行えており、特にストレスを感じずに開発を行えていた。

それに対しリモート環境での開発フローは以下の通りである。

## リモート環境での開発フロー

1. ローカル環境にて PyCharm という IDE で python のソースコードを作成
1. ローカル環境で作成したソースコードを、ssh 接続を用いてリモート環境にアップロード
1. ローカル環境で構築していた Python 環境をリモート環境で再現
1. リモート環境のターミナルからソースコードを実行

---

この通り、開発からかなり煩雑な手順を経なければ実行に漕ぎ着けない。

さらに、リモート環境でエラーが出力されたり、リモート環境のコードや状況を更新する際にも同様に煩雑な手順が必要になるため、流石にこの環境で研究を行うのは無理があると感じた。

そこで、リモート環境での開発フローをローカル環境での開発フローになるべく近づけることを目標に開発環境の改善を行なった。

# PyCharm の SSH 接続サポート

まずは、愛用している IDE である PyCharm を引き続き使いたいという思いから PyCharm が SSH 接続に対応しているか調べてみると、丁度先月アップロードされた [SSH 接続マニュアル](https://www.jetbrains.com/help/pycharm/remote-development-starting-page.html)が存在したので、これに則って環境構築を進めていくことにする。

ちなみに、PyCharm には[日本語版の SSH 接続マニュアル](https://pleiades.io/help/pycharm/remote-development-starting-page.html)も存在するが、和訳が割とふわっとしていて微妙に理解しづらいので、個人的には[英語版の SSH 接続マニュアル](https://www.jetbrains.com/help/pycharm/remote-development-starting-page.html)を読むことを推奨する。

# 環境構築手順

1. 開発環境を構築したいプロジェクトで `Settings > Python Interpreter` から `Add Interpreter > On SSH...` をクリック
![Screenshot 2024-07-02 at 1.07.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569324/a7f8bf29-9d13-799a-9e10-f43228e44d58.png)
1. `New Target: SSH` というウィンドウが開くので、`Host:` の部分にリモート環境に接続する際の `host` を、`Username:` の部分に `username` を、`Port:` の部分に `port` を入力して `Next` をクリック[^1]
![Screenshot 2024-06-04 at 23.42.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569324/797c52f2-ced8-e0e8-67bc-48e7668e6f83.png)
1. このように、`Introspection completed` というメッセージが出れば成功！`Next` をクリック
![Screenshot 2024-05-30 at 16.59.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569324/f844605a-9771-64b7-4eff-092369e17d79.png)
1. リモート環境の `Python Interpreter` を指定する画面に遷移するので、ローカル環境の `Python Interpreter` を指定するときと同様に、実行時に使いたい環境を選択する。今回はリモート環境で構築した `Anaconda` を用いるが、リモート環境で作成した仮想環境 `py3114` が `Use existing environment` の選択肢に表示されている
![Screenshot 2024-07-02 at 1.08.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569324/d2e28895-3b8f-08c3-a015-3ff78c076eda.png)
1. `Sync folders` の右側のディレクトリアイコンを選択すると、ローカルの作業環境を同期させたいリモートの作業環境を指定するウィンドウが表示される。この右側の `Remote Path` の欄にリモート環境でプロジェクト用に割り当てたい領域を指すパスを指定する
![Screenshot 2024-07-02 at 1.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569324/b9fbf96e-458b-aa9b-8c0c-a176ec0f3be6.png)
1. `Execute code with root privileges via sudo` のチェックボックスは、リモート環境において root 権限を持った状態でコードを実行させるかどうかを表す
また、`Automatically upload project files to the server` のチェックボックスは、ローカル環境の差分を自動的にリモート環境にアップロードするかどうかを表す
![Screenshot 2024-07-02 at 1.08.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569324/3a3de2a8-8797-044a-003f-5a0cf398542f.png)
1. 最後に右下の `Create` をクリック
![Screenshot 2024-07-02 at 1.08.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569324/9e398bb9-8925-afce-d382-18a69bf0dd5a.png)

上記の手順が終わるとローカル環境からのファイルのアップロードが始まる。
これで晴れて、リモートのインタプリタを使用可能でファイルの同期が自動的に行われる開発環境を構築できた。
お疲れ様でした。

[^1]: ここでいう `host` や `username` は、`ssh` コマンドを用いてリモート環境に接続する際の `ssh username@host` というフォーマットの `username` や `host` の部分を指している。また、`port` に関しては基本的には `22` であるが、他のポート番号を用いている場合もあるため、詳しくはリモート環境の管理者に聞いていただければ確実だと思われる。