Windows 10 WSL 2(Linux 用 Windows サブシステム) + LinuxでのPython環境作成手順

2021/01/02に公開

本ドキュメントはミラーです。最新の情報は以下Qiitaのドキュメントをご確認ください。:
https://qiita.com/tfukumori/items/c2997988acacd0da17d0


概要

Windows 10における、WSL 2でのLinuxをインストール~Python仮想環境構築までを記載しています。

モジュール 役割
Python (2)で説明
.pyを実行するインタプリタ
pyenv (3,4)で説明
Mac, LinuxでPythonインタプリタを切り替える(複数バージョンを共存)ために使用する
venv (4)で説明
Pythonの仮想環境を作成する(仮想環境は基本的にはプロジェクトごとに作成する)。pyenvでインストールされたpython3.3以降では既定で使用可能

(4)で説明していますが、pyenvでインタプリタを切り替え、venvで仮想環境を作成・切替を行うことで、プロジェクトごとに適した環境で開発を行います。

環境

  • Windows 10 Pro バージョン 2004以降、または1903,1909ビルド18362以上
  • Linux内のPythonのバージョン3.3以上(venv, pyenvの関係)

(1) WSL2環境構築

(1-1) [Windows] WSL2の有効化

以下の公式ページの手動インストールの手順に従い、WSL2を有効化する。

以降、Ubuntu 20.04 LTS を選択した前提で記載します。

💡 WSL2(Windows Subsystem for Linux)導入手順 - Qiita

(1-2) [Windows] インストールしたディストリビューションの起動

スタートメニューからUbuntuを選択します。

初回起動時は以下が表示されるので画面に従いユーザー名とパスワードを設定します。

Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username:

(1-3) [Windows] Windows Terminalのインストール

wingetを利用してインストール

winget install -e --id Microsoft.WindowsTerminal

(1-4) [Windows] VSCodeのインストール

https://code.visualstudio.com/download

  • User Installを使用する
  • 右クリックでCodeで開くにチェックする

(1-5) [Windows] VSCodeで「Remote - WSL拡張機能」のインストール

  1. 「Remote - WSL拡張機能」をインストール

  2. 拡張機能をインストールしたら、VSCodeを再起動

  3. 「Remote - WSL拡張機能」をインストールすると「Remote Explorer」がVS Codeに追加される。Remote Explorerでは、Linuxディストリビューションに関する情報を確認できる。

(1-6) [Windows] VSCodeからWSL2上のUbuntuに接続する

  1. VSCodeを起動し、「Remote Explorer」からUbuntuに接続する。

  2. 接続時に必要なコンポーネント(vscode-server)がUbuntuにインストールされる。

(1-7) [Linux] プロキシ設定

社内環境など外部接続にプロキシが必要な環境では、この項目の設定が必要です。

(1-7-1) 環境変数

Windows TerminalのUbuntuターミナルから実行

code ~/.bashrc

~/.bashrcの最後に追加

~/.bashrc
function proxy_on(){
  HOST="XXX.XXX.XXX.XXX"
  PORT="YYYY"

  # 認証が必要なプロキシ
  PROXY="http://$HOST:$PORT/"

  export HTTP_PROXY=$PROXY
  export HTTPS_PROXY=$PROXY
  export FTP_PROXY=$PROXY
  export http_proxy=$PROXY
  export https_proxy=$PROXY
  export ftp_proxy=$PROXY

  export NO_PROXY="localhost,127.0.0.1"
  export no_proxy="localhost,127.0.0.1" 
}

proxy_on

💡 Linux環境から社内環境のGitサーバーを参照する場合はNO_PROXYに追加する。

bashに反映

source ~/.bashrc

(1-7-2) aptの設定

💡 sudoで実行する場合は、環境変数が引き継がれません。sudo http_proxy=${http_proxy} https_proxy=${https_proxy} <コマンド>という形でもかまいませんが、頻繁に実行する可能性があるaptについては、設定ファイルに記載しておきます。

sudo vi /etc/apt/apt.conf
/etc/apt/apt.conf
Acquire::http::Proxy "http://XXX.XXX.XXX.XXX:YYYY/";
Acquire::https::Proxy "http://XXX.XXX.XXX.XXX:YYYY/";

💡 viの使い方

  • iで挿入モード
  • Escape - :wqで書き込んで終了
  • Escape - :q!で保存しないで終了

(1-8) [Linux] パッケージの更新

Windows TerminalのUbuntuターミナルから実行

# パッケージリストの更新
sudo apt update
# パッケージのアップデート
sudo apt upgrade -y
# 上記で保留されたパッケージのアップデート
sudo apt dist-upgrade -y
# 不要になったパッケージの削除
sudo apt autoremove -y

(2) Pythonの導入

(2-1) [Linux] Pythonのインストール

Windows TerminalのUbuntuターミナルから実行する。

# python3をインストール(インストールされているはずだが念のため)
sudo apt install python3 -y

💡 Python3系ではpython3を利用する。

(2-2) [Windows] Linux環境への拡張機能のインストール

WindowsのVSCodeでWSL2を開き、WSL2のLinux環境に以下の拡張機能をインストールします。(Linux環境ごとにインストールされます。)

  • ms-python.python
  • ms-python.vscode-pylance
  • visualstudioexptteam.vscodeintellicode

(3) pyenvの導入

pyenvでPythonバージョン(インタプリタ)の切り替えを行うことができます。

💡 Windows上に直接環境構築した場合は、Pythonインストール時にインタプリタ切り替えツール(py)がインストールされています。しかしLinux環境には存在しないため、pyenvをインストールする必要があります。

(3-1) [Linux] pyenvのインストール

pyenvのインストール。clone先は$HOME/.pyenvがおすすめです。

git clone https://github.com/pyenv/pyenv.git ~/.pyenv

環境変数の設定

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc

PATH挿入と自動補完の設定。 eval "$(pyenv init -)"がきちんと.bashrcに記載されたか確認します。

echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc

再読み込み

source ~/.bashrc

💡 参考資料では.bash_profileでしたが、今回のUbuntuでは~/.profileが存在し~/.bashrcを読み込んでいるため、~/.bashrcに追記する形が適切です。(.bash_profileに書き込むと.profileを優先し、.bash_profileに記載がないため~/.bashrcを読み込まなくなります。)

Ubuntuでは、こちらに記載があるようにpyenv動作のために必要なライブラリをインストールします。

sudo apt-get install -y build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python-openssl git

(3-2) [Linux] pyenvでインストール可能なインタプリタ

pyenvで利用可能なPythonバージョン一覧を確認します。

pyenv install --list

💡 バージョンが3.3でvenvが利用可能

(3-3) [Linux] pyenvでpythonをインストール

例としてPython3.6.12をインストール

pyenv install 3.6.12

インストールされているPython一覧を確認

pyenv versions

(3-4) [Linux] pyenvで複数のPythonバージョンを切り替え

以下は3.6.12に切り替えてから元に戻す例です。

インタプリタをPython3.6.12に切り替え

pyenv shell 3.6.12

現在のバージョンを確認する

pyenv version

バージョン3.6.12から元にもどす

pyenv shell system

(4) venv + pyenvで任意のバージョンの仮想環境を構築して開発

venv+pyenvを使って、任意のPythonの仮想環境(パッケージ環境)を構築して開発したいときは、以下の手順でインタプリタの切り替えと仮想環境の切り替えを行います。

  1. pyenvでインタプリタを切り替え
  2. プロジェクトフォルダに移動
  3. 切り替えたインタプリタでvenvを実行しプロジェクトごとの仮想環境を作成
  4. 仮想環境に入る
  5. ライブラリのインストール(pip)など
  6. コーディング、実行
  7. 仮想環境を抜ける

以下はpyenvで3.6.12をインストールしていた場合のンタプリタの切り替えと仮想環境構築例です。

(4-1) WindowsフォルダをカレントとしてWSLリモート接続環境のVSCodeを起動

  1. Windowsのエクスプローラーでプロジェクトフォルダに移動
  2. アドレスバーにwslを入力して実行し、プロジェクトフォルダに移動した状態でLinuxターミナルを開く
  3. LinuxターミナルでCode .を入力して、WSLにリモート接続しLinuxにマウントされたプロジェクトフォルダをWindowsのVSCodeで開く

(4-2) インタプリタを切り替え

pyenv shell 3.6.12

(4-3) 仮想環境を構築

cd <プロジェクトフォルダ>
python -m venv .venv

💡 python3では既定のPythonを参照するため、pyenvで切り替えた場合はpythonを指定します。
💡 VSCodeは同じフォルダの仮想環境を自動認識して選択できます。プロジェクトフォルダごとに仮想環境を作成し、仮想環境名称は.venvで統一することをお勧めします。
💡 Windowsのフォルダ(/mnt/cなど)で仮想環境を作成するとエラーとなる場合は、Windowsフォルダのマウントが正しく行われていないことがあります。Linuxにて以下のコマンドを実行してマウントを再作成することで解決することがあります。

Cドライブの場合
cd ~
sudo umount /mnt/c
sudo mount -t drvfs C: /mnt/c -o metadata

(4-4) 仮想環境に入る

Linux ターミナル

cd <プロジェクトフォルダ>
source .venv/bin/activate

Windows VSCode

左下から作成した仮想環境を選択します。

仮想環境内のPythonのバージョン確認

python -version

(4-5) 仮想環境に必要なモジュールのインストール

仮想環境に切り替えられていることを確認し、必要なモジュールをインストール

# まとめてインストールするためのモジュール
pip install wheel
# requirements.txtからインストールする場合の例
pip install -r requirements.txt

💡 事前にpip install wheelを行うことでインストール時の警告が抑制されます。

(4-6) Python 仮想環境を抜ける

deactivate

(5) Jupyter Notebookのインストール

Windows上にインストールしたPython環境ではPythonプラグインを使用することでVSCode上でJupyter Notebookを使用することができます。しかし2020年12月31日現在、Windows→WSL2では動作しなかったため、通常のJupyter Notebookを使用します。

# python仮想環境を起動
cd <プロジェクトフォルダ>
source .venv/bin/activate
# Jupyter Notebookをインストール
pip install wheel
pip install jupyter
# Jupyter Notebookを起動
jupyter notebook

💡 WSL上で起動したJupyter NotebookなどのWebサーバーには、http://localhost~で接続できます。

(6) (PCではなく)WSL2のみを終了、再起動する方法

(6-1) 特定のマシンを停止

  1. [Windows環境] wsl -l -vで確認

    NAME      STATE           VERSION
    * Ubuntu    Running         2
    
  2. [Windows環境] wsl -t <NAME>で停止

    💡 bashのヒストリーなどがクリアされるので注意

  3. [Windows環境] wsl -l -vで確認

    💡 しばらく時間がかかる

    NAME      STATE           VERSION
    * Ubuntu    Running         2
    

(6-2) すべてのマシンをシャットダウン

  1. [Windows環境] wsl --shutdownですべてのマシンをシャットダウン

(6-3) WSL2を再起動するには

再起動は特に明示的に指定する必要はなく、通常通りUbuntuを起動すればOK。

  • Windows Terminalで新規のUbuntuタブを開く
  • Ubuntu2004.exeを実行する(スタートメニューからUbuntu 20.04を選択する)

※本資料には未記載だが、Docker使用時はタスクバーのDockerアイコンを右クリックしてRestartで起動する。


参考資料

https://gist.github.com/takurx/57342618e21b3c1afdf841956cc23da4
https://qiita.com/NahaFujii/items/a0b0f3d3515c2c185309
https://qiita.com/rhene/items/ff11c7850a9a7617c50f
https://qiita.com/imasaaki/items/25694783ae50dd66303e
https://qiita.com/Gushi_maru/items/5ba23d997e32abc98620
https://dongsu.dev/2018/08/01/other/wsl-proxy/
https://messefor.hatenablog.com/entry/2020/08/22/181519#導入と使い方
https://kledgeb.blogspot.com/2020/02/ubuntu-2004-11-ubuntu-2004-ltspython2.html
https://astherier.com/blog/2020/08/how-to-terminate-wsl2/


参考:pyenvでインタプリタ切り替えを行わず既定でインストールされたPython 3.8.5でvenvを使用する場合

# pip3をインストール
sudo apt install pip3-y
# venvをインストール
sudo apt-get install python3-venv -y
# 仮想環境を作成
cd <プロジェクトフォルダ>
python3 -m venv .venv

Discussion