66
70

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-02-20

はじめに

  • 機械学習やデータ分析を行うためのPython実行環境を整備することが目的。

  • 単にPythonを学んでいきたい人は、実行環境整備に悪戦苦闘するよりかは以下がおすすめ。

    • Pythonを「とりあえず触りたい」人は、Google Colaboratory
    • 個人で学んでいく場合はAnaconda
  • 一方、以下の理由から、上記サービスを利用しない環境構築を試みた。

    • 業務利用でも使える → ビジネスユースでも無償、PC内で完結する環境
    • 異なる解析案件毎に独立して作業可能 → 案件ごとに独立した実行環境の構築を行う
    • 単に個人的にVSCodeが好き → VSCode導入を必須

目指す環境

Windows11
執筆環境はProを利用(多分Homeでも同じ環境は構築可能)
バージョンは22H2
WSL2(Ubuntu)
WSL2のインストール時にデフォルトで選択されるUbuntuを利用(詳細は後述)
Python
仮想環境による複数バージョンの共存を行う
本記事では、最新の3.11と、ひとつ前の3.10を共存させる
VSCode
日本語化など最低限のアドオンを導入
Junyper
VSCode上でJunyperを導入

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

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

環境構築

1. Windows11環境整備

A). Windows Update

WindowsUpdateを一通り実施しましょう(未実施による構築不具合を防ぐため)
「設定→Windows Update」の画面が以下のように、最新の状態ですとなっていればOK

B). Windows Terminal更新

Microsoft Storeのアプリ更新を一通り実施しましょう
特に、Windows Terminalが最新化されていることを確認しましょう

昔からWindowsを利用していた人は慣れていないかもしれませんが、コマンドプロンプト等の機能は
Windows Terminal(ターミナル)に集約されました。

ターミナル内でPowerShellを実行すると、以下のような画面が出ると思います。
(※色の設定を変更した後のキャプチャのため、背景色は白ではないと思いますが。。)

3行目あたりの警告文が気になる人は、以下のサイトから最新のPowerShellをダウンロード、インストールしましょう
Windows への PowerShell のインストール

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

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

C). WSL2

WSL2をインストールしていきます。

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

その後、画面上のタブが表示されている一番右の「V」を押し、PowerShellを起動します。
ユーザアカウント制御の警告が出ますがOKを押すと、以下のように管理者権限でPowerShellが起動します。

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

PowerShell
wsl --install

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

wslのインストール時は、指定がない場合Ubuntuが選択されます。
Ubuntu以外のインストールを希望する場合の方法は以下の公式サイトを参照ください。
WSLのインストール

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

D). Ubuntu

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

Ubuntuの更新

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

Ubuntu
sudo apt update
sudo apt upgrade

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

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

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

実行内容を見るとわかるように、更新を行う際のアクセス先が以下の通り、jpのついていない海外サーバとなっています。
http://archive.ubuntu.com/ubuntu

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

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(国内サーバ)に変更されていることが確認可能です。

Ubuntuの日本語化

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

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

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

#一度Ubuntuを終了する
exit

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

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

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

次に、Ubuntuのコマンドマニュアルを日本語化します。

Ubuntu
#日本語マニュアルのインストール
sudo apt install manpages-ja manpages-ja-dev

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

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

参考:
Windowsと、WSL2で構築したUbuntuとの間でファイルを授受する場合、
Windowsのエクスプローラを開くと、Linuxが表示されているため、
そこから通常のエクスプローラを使う要領で、ファイル操作を行います。

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

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

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

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

E). Python

Pythonインストールは、以下のPython Japanのサイトを参考に行います。
Ubuntu環境のPython

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

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

参考までに、デフォルトで導入されているPythonは以下のように確認できます。

Pythonをビルドする際に必要となるツール類のインストール

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

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ダウンロードリンク

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

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

Pythonのビルド、インストール
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上に配置します。

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

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がまだ表示されます。

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

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

Python用仮想環境の構築

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

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

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

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

以下サイトの方の構成案がスマートでしたので、参考にさせていただきました。
Snow Tree in June

Ubuntu
#(ユーザ名)の箇所は各自のものに置換する
cd /home/(ユーザ名)

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

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

今回は、以下を想定し作成します。

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

まずはpy1にPython3.11系環境を作成します。

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系環境を作成します。

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環境内に入ってみましょう。

Ubuntu
#(ユーザ名)の箇所は各自のものに置換する
# 入りたい仮想環境のディレクトリへ移動
cd /home/(ユーザ名)/py_venvs/py1

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

仮想環境に入れていれば、以下のような表示となります。

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

Ubuntu
deactivate

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

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

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

Ubuntu
#(ユーザ名)の箇所は各自のものに置換する
cd /home/(ユーザ名)/py_venvs
rm -rf py1
Python用仮想環境内の設定

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

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

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でも同様の作業を行いましょう。

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

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

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

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

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

また、pipでバージョンを指定しインストールする際には以下コマンドを利用します

Ubuntu
# 更新したいパッケージ名、バージョンを指定し、更新を実行(以下例ではsetuptoolsを更新)
pip install -U setuptools == 65.5.0

不具合等があり以前のバージョンに戻す場合に利用します。

F). VisualStudioCode

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

Download Visual Studio Code

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

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

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

Ubuntu
#(ユーザ名)の箇所は各自のものに置換する
cd /home/(ユーザ名)/py_venvs/py1

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

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

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

また、MicrosoftのPython拡張機能はインストールを行いましょう。

結果、以下の通りとなります

ほかの仮想環境からもVSCodeを実行します。

Ubuntu
#(ユーザ名)の箇所は各自のものに置換する
# ここでは、仮想環境のpy2からVSCodeを実行する
cd /home/(ユーザ名)/py_venvs/py2
code .

Ubuntu上のVSCodeを開いている状態になるため、
py1からVSCodeを実行した際にインストールした拡張機能は、
py2実行時も適用されています。

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

VScodeで簡単なPythonコードを記載し、動作確認を行います。

  • py1環境に接続
  • py1配下にfileフォルダを作成(コードを格納する場所)
  • test.pyを作成しコードを記載
  • 画面右上の実行ボタンを押下

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

G). Jupyter

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

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

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

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

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

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

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

選択肢を選ぶと、新規のJupyter Notebookファイルが生成されます

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

また、画面右上に、実行時のカーネルを選択する欄があります。
まれに操作によって、仮想環境のカーネルと異なるものが選択されており、実行時エラーが出ることがあるので、
適切なものが選ばれているかはチェックしてください。

おわりに

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

2023/3/31追記

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

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

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
66
70
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
66
70