はじめに
-
機械学習やデータ分析を行うための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がインストールされます
(インストール後、再起動が促されるため再起動しましょう)
wsl --install
再起動後、自動でUbuntuが起動します。
ユーザ名とパスワード入力が求められるため、指示に従い入力を実施すれば、WSL2によるUbuntuの環境が完成です。
Windowsのユーザ名やパスワードと同一である必要はなく、任意の値で問題ありません。
wslのインストール時は、指定がない場合Ubuntuが選択されます。
Ubuntu以外のインストールを希望する場合の方法は以下の公式サイトを参照ください。
WSLのインストール
以後はPowerShellを管理者権限で実行する必要はないため、
設定を戻し、管理者権限での実行とならないようにするとよいです
D). Ubuntu
WSL2で動くUbuntuの設定を行います。
WSL2インストール直後のUbuntu上におけるアカウント設定画面のまま継続してもよいですし、
閉じてしまった方は、ターミナルを起動後、画面上のタブが表示されている一番右の「V」を押し、
Ubuntuを選択することで、Ubuntuが起動します。
Ubuntuの更新
まずはUbuntuのアップデート(WindowsUpdateみたいな、OS自体の更新)を実施します。
以下を実行します。
sudo apt update
sudo apt upgrade
管理者権限での実行が必要となるため、sudoコマンドとなっています。
そのため、下の図のようにパスワード入力が求められます。
また、upgradeを実行した際、更新が必要なものがある場合は更新するかを聞かれるため、
問題なければYを入力し、処理を継続させてください。
Ubuntuの更新はこのように手動で実行する必要があります。(今後も定期的に手動実行しましょう)
実行内容を見るとわかるように、更新を行う際のアクセス先が以下の通り、jpのついていない海外サーバとなっています。
http://archive.ubuntu.com/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の日本語化
以下を実行し、日本語パックをインストールします。
#日本語パックのインストール
sudo apt install language-pack-ja
#日本語の適用
sudo update-locale LANG=ja_JP.UTF-8
#一度Ubuntuを終了する
exit
正しく適用されているかを確認します。
#日本語で日付が表示されるか確認
date
#言語設定が日本語であるか確認
echo $LANG
次に、Ubuntuのコマンドマニュアルを日本語化します。
#日本語マニュアルのインストール
sudo apt install manpages-ja manpages-ja-dev
#マニュアル表示 ※ページ送りはEnterキー、終了はqキー
man ls
以上でUbuntuの基本的な設定は完了です。
参考:
WSL2で構築したUbuntuの状態確認や、Ubuntu環境自体のアンインストールを行う場合、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のサイト記載に従い、事前に必要となるツール類をインストールします。
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のサイトから飛べるサイトです、
※気になる方は英語版公式サイトからダウンロードを行ってください。
インストールはWindows上ではなく、Ubuntu上で行うため、「Source」からダウンロードを行います。
ダウンロードしたファイルは、Windowsのエクスプローラを利用し、Ubuntu上に配置します。
ある程度自由に配置してよいですが、「/home/ユーザ名」に格納しておきます。
Pythonのビルド、インストール
#/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上に配置します。
こちらもビルド、インストールを行います。
#/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
#(ユーザ名)の箇所は各自のものに置換する
cd /home/(ユーザ名)
#仮想環境を一括格納するディレクトリを作成
#これから作る各仮想環境は、すべてこのディレクトリ内で作成する思想で行う
mkdir py_venvs
#仮想環境を格納する各ディレクトリを作成
cd py_venvs
mkdir py1
mkdir py2
今回は、以下を想定し作成します。
- ある作業ではPython3.11を利用 → py1に構築
- それとは別の作業ではPython3.10を利用 → py2に構築
さらに環境を増やすことも可能ですし、3.11系環境を複数作成することも可能です。
まずはpy1にPython3.11系環境を作成します。
#(ユーザ名)の箇所は各自のものに置換する
# 仮想環境を作成するディレクトリへ移動
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系環境を作成します。
#(ユーザ名)の箇所は各自のものに置換する
# 仮想環境を作成するディレクトリへ移動
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環境内に入ってみましょう。
#(ユーザ名)の箇所は各自のものに置換する
# 入りたい仮想環境のディレクトリへ移動
cd /home/(ユーザ名)/py_venvs/py1
# 仮想環境への切り替え
# 仮想環境の設定を記録したディレクトリ(ここでは.venv1)内の、
# bin/activateを指定し、sourceコマンドを実行する
source .venv1/bin/activate
仮想環境から抜けるためには以下のコマンドを利用します。
deactivate
ここで、2つの仮想環境に入り比べ、Pythonのバージョンを見てみます。
py1の環境でpython3のバージョンを確認すると3.11系、
py2の環境でpython3のバージョンを確認すると3.10系であることがわかります。
それぞれの環境内では、環境構築時指定したバージョンが主役として動いており、
他のバージョンを意識する必要はありません。
仮想環境を削除する場合、py1やpy2のディレクトリを丸ごと削除すれば大丈夫です。
#(ユーザ名)の箇所は各自のものに置換する
cd /home/(ユーザ名)/py_venvs
rm -rf py1
Python用仮想環境内の設定
作成した仮想環境内に入り、設定を実施します。
当然ですが、他に干渉しない独立した環境を作ることを目的としているため、
py1での作業は、py2には一切影響しません。
(裏を返せば、py1、py2両方に反映したい作業がある場合は、それぞれで同様の作業を行う必要があります)
py1の環境に入り、pipコマンドで必要となるパッケージを導入します。
#(ユーザ名)の箇所は各自のものに置換する
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で導入したパッケージの更新を行いたい場合は以下の通りです。
自動で更新されることはないため、必要に応じ手動で実行します。
#(ユーザ名)の箇所は各自のものに置換する
cd /home/(ユーザ名)/py_venvs/py1
source .venv1/bin/activate
# 新しいバージョンが存在するものを一覧表示
pip list -o
# 更新したいパッケージ名を指定し、更新を実行(以下例ではsetuptoolsを更新)
pip install -U setuptools
# 新しいバージョンが存在するものを一覧表示(更新できていれば表示されなくなる)
pip list -o
また、pipでバージョンを指定しインストールする際には以下コマンドを利用します
# 更新したいパッケージ名、バージョンを指定し、更新を実行(以下例ではsetuptoolsを更新)
pip install -U setuptools == 65.5.0
不具合等があり以前のバージョンに戻す場合に利用します。
F). VisualStudioCode
WindowsにVisualStudioCodeをインストールします。
以下ページからWindows版のインストールを行ってください。
インストール後、起動すると次の画面が出ます。
初期は英語ですが、日本語にしたい場合は右下の案内に従い日本語化を行います。
その後、拡張機能を選択、「Remote Development」を検索しインストールします。
インストール後、一度VSCodeは閉じておきます。
その後、Ubuntuに接続し、UbuntuからVSCodeを実行します。
#(ユーザ名)の箇所は各自のものに置換する
cd /home/(ユーザ名)/py_venvs/py1
# 仮想環境からVSCodeを実行
# 初回はVSCodeServer等がインストールされる
code .
コマンド実行後、VSCodeが自動で起動し、以下のようなメッセージが出ます。
「はい、作成者を信頼します」を選択してください。
(チェックボックスを選択してもOK。そうすれば他の仮想環境接続時のメッセージが出なくなる)
これでUbuntuからVSCodeが実行されている状態です。
このVSCodeにも必要な拡張機能をインストールしましょう。
例えば以下のように、Windows上でインストールした日本語パックは、初期ではUbuntu上でのVSCodeにはインストールされていません。
必要となる拡張機能はインストールを行います。
また、MicrosoftのPython拡張機能はインストールを行いましょう。
ほかの仮想環境からもVSCodeを実行します。
#(ユーザ名)の箇所は各自のものに置換する
# ここでは、仮想環境の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など他の仮想環境も同様にインストールします)
#(ユーザ名)の箇所は各自のものに置換する
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を変更することで改善します。
# 自動で生成されている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