Windows11 で WSL2 + VSCodeによる複数のpython仮想開発環境を作る

# はじめに
* 機械学習やデータ分析を行うためのPython実行環境を整備することが目的。
* 単にPythonを学んでいきたい人は、実行環境整備に悪戦苦闘するよりかは以下がおすすめ。
    * Pythonを「とりあえず触りたい」人は、Google Colaboratory
    * 個人で学んでいく場合はAnaconda

* 一方、以下の理由から、上記サービスを利用しない環境構築を試みた。
    * 業務利用でも使える　→　ビジネスユースでも無償、PC内で完結する環境
    * 異なる解析案件毎に独立して作業可能　→　案件ごとに独立した実行環境の構築を行う
    * 単に個人的にVSCodeが好き　→　VSCode導入を必須


# 目指す環境
<dl>
  <dt>Windows11</dt>
  <dd>執筆環境はProを利用（多分Homeでも同じ環境は構築可能）</dd>
  <dd>バージョンは22H2</dd>

  <dt>WSL2(Ubuntu)</dt>
  <dd>WSL2のインストール時にデフォルトで選択されるUbuntuを利用（詳細は後述）</dd>

  <dt>Python</dt>
  <dd>仮想環境による複数バージョンの共存を行う</dd>
  <dd>本記事では、最新の3.11と、ひとつ前の3.10を共存させる</dd>

  <dt>VSCode</dt>
  <dd>日本語化など最低限のアドオンを導入</dd>

  <dt>Junyper</dt>
  <dd>VSCode上でJunyperを導入</dd>
</dl>

その他、作業過程で気になった古いアプリバージョン等は最新化していきます。

:::note info
この記事は2023/2時点での情報で記載します
:::



# 環境構築
### Windows11環境整備
#### A). Windows Update
WindowsUpdateを一通り実施しましょう（未実施による構築不具合を防ぐため）
「設定→Windows Update」の画面が以下のように、最新の状態ですとなっていればOK
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/e94679d8-99a5-cf93-a8e6-e80f7485704e.png" width = 70%>

#### B). Windows Terminal更新
Microsoft Storeのアプリ更新を一通り実施しましょう
特に、Windows Terminalが最新化されていることを確認しましょう
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/80503488-4c13-145a-cb22-32a1588a8192.png" width = 70%>
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/a1f643c9-418c-9a78-564d-1b35c8a4f7e3.png" width = 70%>

昔からWindowsを利用していた人は慣れていないかもしれませんが、コマンドプロンプト等の機能は
Windows Terminal（ターミナル）に集約されました。
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/7a363caf-3ff4-ec16-9597-f98aac9553de.png" width = 70%>


:::note info
ターミナル内でPowerShellを実行すると、以下のような画面が出ると思います。
（※色の設定を変更した後のキャプチャのため、背景色は白ではないと思いますが。。）
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/37ae2043-431d-3153-f1bf-53f0baf45c41.png" width = 70%>

３行目あたりの警告文が気になる人は、以下のサイトから最新のPowerShellをダウンロード、インストールしましょう
[Windows への PowerShell のインストール](https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows?source=recommendations&view=powershell-7.3#msi "MSI パッケージ ")

PowerShellは2023/2時点で、7.3.2が最新バージョンです。
インストール方法は複数ありますが、MSIパッケージであればGUIでインストールが可能なため、
上記リンクはMSIパッケージでのインストール方法へ飛ばしています。

なお、本サイトではPowerShell7.3を導入した前提で執筆しています
:::


#### C). WSL2
WSL2をインストールしていきます。

まずは、ターミナルを起動後、画面上のタブが表示されている一番右の「V」を押し、設定を開きます。
その後、PowerShell（※PowerShell7.3をインストールしていない場合はWindows PowerShell」）を選択、
「このプロファイルを管理者として実行する」を、オフからオンに切り替え、保存します。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/a58aefa5-ea15-83e7-b4b5-5e2604bb6953.png" width = 70%>

その後、画面上のタブが表示されている一番右の「V」を押し、PowerShellを起動します。
ユーザアカウント制御の警告が出ますがOKを押すと、以下のように管理者権限でPowerShellが起動します。
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/bf925baa-8f90-766a-5105-d742a0d4e06f.png" width = 70%>

ここで、以下コマンドを入力し、実行すれば、WSL2がインストールされます
（インストール後、再起動が促されるため再起動しましょう）

```bash:PowerShell
wsl --install
```

再起動後、自動でUbuntuが起動します。
ユーザ名とパスワード入力が求められるため、指示に従い入力を実施すれば、WSL2によるUbuntuの環境が完成です。
Windowsのユーザ名やパスワードと同一である必要はなく、任意の値で問題ありません。

:::note info
wslのインストール時は、指定がない場合Ubuntuが選択されます。
Ubuntu以外のインストールを希望する場合の方法は以下の公式サイトを参照ください。
[WSLのインストール](https://learn.microsoft.com/ja-jp/windows/wsl/install "WSLのインストール")
:::

:::note info
以後はPowerShellを管理者権限で実行する必要はないため、
設定を戻し、管理者権限での実行とならないようにするとよいです
:::


#### D). Ubuntu
WSL2で動くUbuntuの設定を行います。
WSL2インストール直後のUbuntu上におけるアカウント設定画面のまま継続してもよいですし、
閉じてしまった方は、ターミナルを起動後、画面上のタブが表示されている一番右の「V」を押し、
Ubuntuを選択することで、Ubuntuが起動します。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/e90d4322-9049-b455-d2e9-8454c6fcb8b6.png" width = 70%>

###### Ubuntuの更新
まずはUbuntuのアップデート（WindowsUpdateみたいな、OS自体の更新）を実施します。
以下を実行します。

```bash:Ubuntu
sudo apt update
sudo apt upgrade
```

管理者権限での実行が必要となるため、sudoコマンドとなっています。
そのため、下の図のようにパスワード入力が求められます。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/a9ac96d9-a016-a9d3-5e41-7c4c5f038c81.png" width = 70%>

また、upgradeを実行した際、更新が必要なものがある場合は更新するかを聞かれるため、
問題なければYを入力し、処理を継続させてください。

:::note info
Ubuntuの更新はこのように手動で実行する必要があります。（今後も定期的に手動実行しましょう）
:::


実行内容を見るとわかるように、更新を行う際のアクセス先が以下の通り、jpのついていない海外サーバとなっています。
http://archive.ubuntu.com/ubuntu
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/07e945ed-9327-86ba-16d1-abb61c25cefd.png" width = 70%>

向き先を以下の通り、国内サーバに変更しておきます。

```bash:Ubuntu
# sources.listがあるディレクトリへ移動
cd /etc/apt

#source.list中の「http://archive.ubuntu.com」を「http://jp.archive.ubuntu.com」に変更
sudo sed -i.bak -e "s/http:\/\/archive\.ubuntu\.com/http:\/\/jp\.archive\.ubuntu\.com/g" sources.list
```

変更後、再度updateを実行すると、アクセス先がjp(国内サーバ)に変更されていることが確認可能です。

:::note info
2024/12追記

Ubuntuのバージョンアップに伴い、最新のUbuntuではsources.listではなく、
/etc/apt/sources.list.d　にある　ubuntu.sourcesに変更となっていました。

このサイト手順通りに対応してインストールしたUbuntuの場合は、以下コマンドを実行してください。

```bash:Ubuntu
# ubuntu.sourcesがあるディレクトリへ移動
cd /etc/apt/sources.list.d

#ubuntu.sources中の「http://archive.ubuntu.com」を「http://jp.archive.ubuntu.com」に変更
sudo sed -i.bak -e "s/http:\/\/archive\.ubuntu\.com/http:\/\/jp\.archive\.ubuntu\.com/g" ubuntu.sources
```


:::



###### Ubuntuの日本語化
以下を実行し、日本語パックをインストールします。

```bash:Ubuntu
#日本語パックのインストール
sudo apt install language-pack-ja

#日本語の適用
sudo update-locale LANG=ja_JP.UTF-8

#一度Ubuntuを終了する
exit
```


正しく適用されているかを確認します。

```bash:Ubuntu
#日本語で日付が表示されるか確認
date

#言語設定が日本語であるか確認
echo $LANG
```

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/880a92db-93be-80a7-46bf-cd0a11e41207.png" width = 70%>


次に、Ubuntuのコマンドマニュアルを日本語化します。
```bash:Ubuntu
#日本語マニュアルのインストール
sudo apt install manpages-ja manpages-ja-dev

#マニュアル表示　※ページ送りはEnterキー、終了はqキー
man ls
```

以上でUbuntuの基本的な設定は完了です。

:::note info
参考：
Windowsと、WSL2で構築したUbuntuとの間でファイルを授受する場合、
Windowsのエクスプローラを開くと、Linuxが表示されているため、
そこから通常のエクスプローラを使う要領で、ファイル操作を行います。
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/4656dd5d-9f2f-8b5f-83c3-65aa82edf607.png" width = 70%>
:::

:::note info
参考：
WSL2で構築したUbuntuの状態確認や、Ubuntu環境自体のアンインストールを行う場合、PowerShell上で以下の操作を行います。

```bash:PowerShell
#インストール済みの環境確認
wsl --list --verbose

#インストール済みの環境をシャットダウン　※アンインストールする場合、その前にシャットダウンを行う
wsl --shutdown

#インストール済みの環境をアンインストール　※listで表示させたNameに記載されている名称を指定し、アンインストールする
wsl --unregister Ubuntu
```
:::


#### E). Python
Pythonインストールは、以下のPython Japanのサイトを参考に行います。
[Ubuntu環境のPython](https://www.python.jp/install/ubuntu/index.html "Ubuntu環境のPython")

こちらのサイトの冒頭にある以下の記載の通り、Ubuntuには最初からPythonが導入されていますが、
そのPythonは利用せず、新たに独自にPythonをインストールします。

>Ubuntu には最初からPythonがインストールされており、そのまま利用可能です。
>しかし、このPython は、 OS がさまざまな機能を提供するために使用しています。ユーザが勝手にパッケージを導入したりすると、 OS の安定性を損なうことも考えられますので、別途、あたらしいPythonをインストールするのが一般的です。

参考までに、デフォルトで導入されているPythonは以下のように確認できます。
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/ef628a89-7fa6-cb57-4d3e-6e343223a707.png" width = 70%>





###### Pythonをビルドする際に必要となるツール類のインストール
Python Japanのサイト記載に従い、事前に必要となるツール類をインストールします。

```bash:Ubuntu
sudo apt update

sudo apt install build-essential libbz2-dev libdb-dev \
 libreadline-dev libffi-dev libgdbm-dev liblzma-dev \
 libncursesw5-dev libsqlite3-dev libssl-dev \
 zlib1g-dev uuid-dev tk-dev

```

###### Pythonのソースコードダウンロード
以下のサイトから最新のPythonをダウンロードします。
※「非公式」とありますが、Python Japanのサイトから飛べるサイトです、
※気になる方は英語版公式サイトからダウンロードを行ってください。

[非公式Pythonダウンロードリンク](https://pythonlinks.python.jp/ja/index.html
 "非公式Pythonダウンロードリンク")
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/6f05736c-f524-e573-1357-bc84931d1285.png" width = 70%>

インストールはWindows上ではなく、Ubuntu上で行うため、「Source」からダウンロードを行います。

ダウンロードしたファイルは、Windowsのエクスプローラを利用し、Ubuntu上に配置します。
ある程度自由に配置してよいですが、「/home/ユーザ名」に格納しておきます。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/9093384f-f1f3-4ff5-a841-28aedcfe4b8c.png" width = 70%>


###### Pythonのビルド、インストール
```bash:Ubuntu
#/home/ユーザ名　以外に配置した場合は、cdコマンドで該当ファイルがある場所へ移動する

#圧縮ファイルの解凍
#Pyhtonのバージョンによってファイル名が変わるので適宜読み替える
tar xJf Python-3.11.1.tar.xz

#解凍後のディレクトリに移動
#Pyhtonのバージョンによってファイル名が変わるので適宜読み替える
cd Python-3.11.1

#ビルド、インストールを実行
./configure
make
sudo make install
```

これでUbuntu上にPythonのインストールが完了しました。
これだけでも良いのですが、「異なる解析案件毎に独立して作業可能　→　案件ごとに独立した実行環境の構築を行う」ことを想定し、
異なるPythonバージョンによる環境を作ることを目指します。


先ほどと同様にインストールしたいPythonをダウンロードします。
ここでは3.10系のPythonを選択しています。
ダウンロードしたファイルは先ほどと同様にUbuntu上に配置します。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/5a400a56-eb15-c15f-581a-20e11a516b9c.png" width = 70%>

こちらもビルド、インストールを行います。

```bash:Ubuntu
#/home/ユーザ名　以外に配置した場合は、cdコマンドで該当ファイルがある場所へ移動する
#特に、ひとつ前の作業と連続して実行する場合、「cd Python-3.11.1」で移動済みのため、
#/home/ユーザ名　に戻る必要があることに注意

#圧縮ファイルの解凍
#Pyhtonのバージョンによってファイル名が変わるので適宜読み替える
tar xJf Python-3.10.9.tar.xz

#解凍後のディレクトリに移動
#Pyhtonのバージョンによってファイル名が変わるので適宜読み替える
cd Python-3.10.9

#ビルド、インストールを実行　※最後のコマンドが、altinstallとなっている
./configure
make
sudo make altinstall
```

一通りインストールが完了したら、インストールされているかを確認します。

インストール直後、Ubuntuからexitをせずにバージョンを確認すると、
以下の通り、Ubuntuに初期インストールされている3.10.6がまだ表示されます。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/f7caf7ff-7450-0c1e-50bb-e3c03908cdec.png" width = 70%>

この後、一度exitコマンドでUbuntu から抜け、再度Ubuntuに入り直し、バージョンを確認すると以下の通り
インストールしたPythonのバージョンが表示されていればOKです。
※altinstallではなくinstallをしたほうのバージョンが、python3 --versionで表示されていることも確認できます

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/e402ea31-e68e-e1cd-b550-e0dd0bc9c490.png" width = 70%>

なお、従来から入っているPython（ここでは3.10.6系）は、
/usr/bin/python3にそのまま残っています。
こちらはUbuntu自体が利用する環境なので放っておきましょう。



###### Python用仮想環境の構築
Python用仮想環境をvenvで作成していきます。
仮想環境を作る目的は、

* ある作業ではPython3.11を利用
* 別の作業ではPython3.11を利用しつつ、上記とは異なるパッケージ類を入れる
* それとは別の作業ではPython3.10を利用する

というような対応をしたい場合、それぞれの作業が他の作業に干渉しないようにするためです。
（ここでは、仮に2つの仮想環境を作成してみます）


まずは仮想環境を適切に管理するため、ディレクトリ構成を考えます。
無秩序に作成するとどこにどの環境があるかわからなくなるため、
将来的に管理、把握しやすい構造を考えましょう。

以下サイトの方の構成案がスマートでしたので、参考にさせていただきました。
[Snow Tree in June](https://snowtree-injune.com/2020/10/10/django-install-dj008/#toc12
 "仮想環境のディレクトリ構成")


```bash:Ubuntu
#（ユーザ名）の箇所は各自のものに置換する
cd /home/（ユーザ名）

#仮想環境を一括格納するディレクトリを作成
#これから作る各仮想環境は、すべてこのディレクトリ内で作成する思想で行う
mkdir py_venvs

#仮想環境を格納する各ディレクトリを作成
cd py_venvs
mkdir py1
mkdir py2
```


今回は、以下を想定し作成します。
* ある作業ではPython3.11を利用　→　py1に構築
* それとは別の作業ではPython3.10を利用　→　py2に構築
さらに環境を増やすことも可能ですし、3.11系環境を複数作成することも可能です。


まずはpy1にPython3.11系環境を作成します。
```bash:Ubuntu
#（ユーザ名）の箇所は各自のものに置換する
# 仮想環境を作成するディレクトリへ移動
cd /home/（ユーザ名）/py_venvs/py1

#仮想環境の作成
#今回は3.11系で作成する。3.11はaltinstallではなくinstallで導入したものであり、
#「python3」コマンドで自動で3.11系となる。
#もちろん、python3.11 -m venv .venv1でも良い。

#また、「.venv1」には仮想環境の設定が記録される。
#自由な名称を付けてよいが、「.」から始めて設定用であることを明記するとわかりやすい。

python3 -m venv .venv1
```

同様に、py2にPython3.10系環境を作成します。
```bash:Ubuntu
#（ユーザ名）の箇所は各自のものに置換する
# 仮想環境を作成するディレクトリへ移動
cd /home/（ユーザ名）/py_venvs/py2

#仮想環境の作成
#今回は3.10系で作成する。3.11はaltinstallで導入したものであり、
#「python3」コマンドではなく、python3.10コマンドで実行する
python3.10 -m venv .venv2
```

以上で、py1に3.11環境、py2に3.10環境が構築できました。
さらに別に環境を作りたい場合、py3、py4・・・と作成し、
それぞれに同様の作業を行えばOKです。

py1環境内に入ってみましょう。
```bash:Ubuntu
#（ユーザ名）の箇所は各自のものに置換する
# 入りたい仮想環境のディレクトリへ移動
cd /home/（ユーザ名）/py_venvs/py1

# 仮想環境への切り替え
# 仮想環境の設定を記録したディレクトリ（ここでは.venv1）内の、
# bin/activateを指定し、sourceコマンドを実行する
source .venv1/bin/activate
```

仮想環境に入れていれば、以下のような表示となります。
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/8f2b8f0d-a43f-d836-4a54-d4096cb2cc0a.png" width = 70%>

仮想環境から抜けるためには以下のコマンドを利用します。
```bash:Ubuntu
deactivate
```

ここで、２つの仮想環境に入り比べ、Pythonのバージョンを見てみます。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/16e59a3c-b0d4-ddf5-45f8-8c1a9abd16db.png" width = 70%>

py1の環境でpython3のバージョンを確認すると3.11系、
py2の環境でpython3のバージョンを確認すると3.10系であることがわかります。
それぞれの環境内では、環境構築時指定したバージョンが主役として動いており、
他のバージョンを意識する必要はありません。

:::note info
仮想環境を削除する場合、py1やpy2のディレクトリを丸ごと削除すれば大丈夫です。

```bash:Ubuntu
#（ユーザ名）の箇所は各自のものに置換する
cd /home/（ユーザ名）/py_venvs
rm -rf py1
```
:::



###### Python用仮想環境内の設定
作成した仮想環境内に入り、設定を実施します。
当然ですが、他に干渉しない独立した環境を作ることを目的としているため、
py1での作業は、py2には一切影響しません。
（裏を返せば、py1、py2両方に反映したい作業がある場合は、それぞれで同様の作業を行う必要があります）

py1の環境に入り、pipコマンドで必要となるパッケージを導入します。

```bash:Ubuntu
#（ユーザ名）の箇所は各自のものに置換する
cd /home/（ユーザ名）/py_venvs/py1
source .venv1/bin/activate

# 最初にpip自体を更新する
# 前述の通り、仮想環境に入れば、python3で記載すればその仮想環境構築時のバージョンが動くので、
# 特にpython3.11やpython3.10など、バージョン指定をする必要はない
python3 -m pip install -U pip

# 自由に導入したいパッケージをpipにより導入する
# 以下は例として、pandasを導入するコマンド
python3 -m pip install pandas

# 導入済みパッケージ一覧を表示し、インストール状況を確認する
pip list
```

繰り返しになりますが、pipの更新も、自身で導入したパッケージも、
py1で行った作業はpy2には反映されません。
必要に応じpy2でも同様の作業を行いましょう。


:::note info
pipで導入したパッケージの更新を行いたい場合は以下の通りです。
自動で更新されることはないため、必要に応じ手動で実行します。

```bash:Ubuntu
#（ユーザ名）の箇所は各自のものに置換する
cd /home/（ユーザ名）/py_venvs/py1
source .venv1/bin/activate

# 新しいバージョンが存在するものを一覧表示
pip list -o

# 更新したいパッケージ名を指定し、更新を実行（以下例ではsetuptoolsを更新）
pip install -U setuptools

# 新しいバージョンが存在するものを一覧表示（更新できていれば表示されなくなる）
pip list -o
```

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/31ce6291-3052-5ec6-4580-1b2f4345238a.png" width = 70%>

また、pipでバージョンを指定しインストールする際には以下コマンドを利用します
```bash:Ubuntu
# 更新したいパッケージ名、バージョンを指定し、更新を実行（以下例ではsetuptoolsを更新）
pip install -U setuptools == 65.5.0
```
不具合等があり以前のバージョンに戻す場合に利用します。
:::



#### F). VisualStudioCode
WindowsにVisualStudioCodeをインストールします。
以下ページからWindows版のインストールを行ってください。

[Download Visual Studio Code](https://code.visualstudio.com/download "VSCodeのインストール")

インストール後、起動すると次の画面が出ます。
初期は英語ですが、日本語にしたい場合は右下の案内に従い日本語化を行います。


<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/985af786-a5f9-ef00-f4f8-16d64e5fd6c1.png" width = 70%>

その後、拡張機能を選択、「Remote Development」を検索しインストールします。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/60b489db-01c8-4878-e47b-7951e0814613.png" width = 70%>

インストール後、一度VSCodeは閉じておきます。
その後、Ubuntuに接続し、UbuntuからVSCodeを実行します。

```bash:Ubuntu
#（ユーザ名）の箇所は各自のものに置換する
cd /home/（ユーザ名）/py_venvs/py1

# 仮想環境からVSCodeを実行
# 初回はVSCodeServer等がインストールされる
code .
```

コマンド実行後、VSCodeが自動で起動し、以下のようなメッセージが出ます。
「はい、作成者を信頼します」を選択してください。
（チェックボックスを選択してもOK。そうすれば他の仮想環境接続時のメッセージが出なくなる）

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/7b9454f8-63e7-c8ac-ae25-2557a016bf85.png" width = 70%>

これでUbuntuからVSCodeが実行されている状態です。
このVSCodeにも必要な拡張機能をインストールしましょう。
例えば以下のように、Windows上でインストールした日本語パックは、初期ではUbuntu上でのVSCodeにはインストールされていません。
必要となる拡張機能はインストールを行います。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/895b6655-ef3a-4c41-3096-1ccde90339ad.png" width = 70%>

また、MicrosoftのPython拡張機能はインストールを行いましょう。
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/827cc01e-d513-8924-c90d-5725b506abd5.png" width = 70%>

結果、以下の通りとなります
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/46746f78-1f6f-68a4-aad1-04d0dc78504b.png" width = 70%>


ほかの仮想環境からもVSCodeを実行します。
```bash:Ubuntu
#（ユーザ名）の箇所は各自のものに置換する
# ここでは、仮想環境のpy2からVSCodeを実行する
cd /home/（ユーザ名）/py_venvs/py2
code .
```
Ubuntu上のVSCodeを開いている状態になるため、
py1からVSCodeを実行した際にインストールした拡張機能は、
py2実行時も適用されています。

また、以後はUbuntuのコマンド実行ではなく、
Windows上のVSCodeを実行後、リモートエクスプローラから
接続したい仮想環境を選択することで、接続可能です。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/32f5675a-de59-63cc-dc9b-7e4a75d292b1.png" width = 70%>

VScodeで簡単なPythonコードを記載し、動作確認を行います。
+ py1環境に接続
+ py1配下にfileフォルダを作成（コードを格納する場所）
+ test.pyを作成しコードを記載
+ 画面右上の実行ボタンを押下

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/7124c610-b6e2-a68c-85a4-ead952758721.png" width = 70%>

ターミナルに実行結果が出力されればOKです。


#### G). Jupyter
Jupyterが利用できるように設定を行います。
ここまでの手順で、VSCodeの拡張機能としてのJupyterはインストールされていますが、
それだけではJupyterの機能は利用できません。

Ubuntu側でjupyter機能をpipインストールする必要があります。
※仮想環境ごとに実行が必要です

以下の通り、py1環境にjupyterをインストールします。
（py2など他の仮想環境も同様にインストールします）

```bash:Ubuntu
#（ユーザ名）の箇所は各自のものに置換する
cd /home/（ユーザ名）/py_venvs/py1
source .venv1/bin/activate

# jupyterをpipインストール
pip install jupyter
```

このjuputerインストールにより、多数のパッケージが一括インストールされます。(80個強）

その後、再度VSCodeで仮想環境に接続し、
画面上のコマンド入力欄に、>jupyterを入力します。
新しいJupyter Notebookを作成する選択肢が出てきます。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/6f30bbb6-cf45-7130-689e-32a2ad7e1942.png" width = 70%>

選択肢を選ぶと、新規のJupyter Notebookファイルが生成されます
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/a831b200-1949-dd00-177f-6a5bdcb71820.png" width = 70%>

なお、この時点ではファイルは保存されていないため、名前を付けて保存を行いましょう。

また、画面右上に、実行時のカーネルを選択する欄があります。
まれに操作によって、仮想環境のカーネルと異なるものが選択されており、実行時エラーが出ることがあるので、
適切なものが選ばれているかはチェックしてください。
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111552/2ce82de1-a7fa-2b36-32f3-9f4e81490d79.png" width = 70%>



# おわりに
想定以上に長くなりましたが、以上で環境構築は完了です。
自分で分かったうえで環境を構築できると、エラー時などの対応力も上がると思うので、
皆様もよければ一度試してみてください。


# 2023/3/31追記
WSLでpip等の外部通信が発生する処理を行うと、遅い時が多発し原因を調べたので追記します。

どうやらデフォルトで設定されている接続先DNSの遅さの問題の様子、
よって以下の手順に従い、向き先DNSを変更することで改善します。


```bash:Ubuntu
# 自動で生成されているresolvファイルをいったん削除
sudo rm /etc/resolv.conf

# 新たに、DNSの設定を記載したresolvファイルを作成
# 8.8.8.8はGoogleが公開しているDNS
sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf'
# 代替DNS追加、APNICとCloudflareが公開しているDNS
sudo bash -c 'echo "nameserver 1.1.1.1" >> /etc/resolv.conf'
sudo bash -c 'echo "nameserver 1.0.0.1" >> /etc/resolv.conf'

# 自動で勝手にDNS設定が変わらないように設定を追加
sudo bash -c 'echo "[network]" > /etc/wsl.conf'
sudo bash -c 'echo "generateResolvConf = false" >> /etc/wsl.conf'

# 作成したresolvファイルが削除、編集されないよう保護
sudo chattr +i /etc/resolv.conf
```