WSL および Linux, Unix へのPythonの環境構築について記録する.
インタプリタ言語である Python
は多様な module
を import
することにより,様々な場面で活用できる.
ただ,M1 Mac
をはじめとする Apple Sillicon
は Intel CPU
と回路設計が異なるため,行列計算などを行う numpy
などが不調になることがある1.
以上の問題点を克服するために,動作する環境を移築しやすい Python
の環境構築について記録する.
ここで,コンピュータの評価指標である RASIS
も併記しておく.
- Reliability: 信頼性
- Availability: 可用性
- Serviceability: 保守性
- Integrity: 保全性
- Security: 安全性, 機密性
まず,保守性の高い環境のために仮想環境を構築する.
Python
の仮想環境は,大きく分けると以下の3つが主流かと思われる.
pyenv
+venv
pyenv
+Poetry
Conda
+conda-forge
今回はこれの 1.
の実装について記録する.
いままでの環境は Conda
を使用しており,3.
の状態だったが,いくつか懸念点があったため,新たに環境を構築する.
Python
のバージョンはそれほど変更しないMac
とWindows
,Linux
で環境移築が面倒conda
のmodule
を毎回インストールしなくてはならないconda
の環境によっては圧縮した環境を OS を超えて展開できない
conda
環境でpip
インストールしていたので崩壊の危険があった
代替案として,venv
の導入を試行する.
Poetry
を使用する案もあったが,新規ツールを増やすことで不安定要素を増やすことになるため保留する.
今回導入する環境の案は以下の通り - 参考
- A.インタープリタ切替
Conda
->pyenv
- B.パッケージ切替
- (
Conda
&pip
) ->venv
- (
- C.パッケージインストール
- (
Conda
&pip
) ->pip
- (
- D.リポジトリ
Conda
->PyPI(Python Package Index)
これで,.py
ファイルの保管ディレクトリにある module
情報を実行時に読み出し,実行に最適な環境を逐次よみだせるようになる.
anyenv
のインストールpyenv
のインストールPython
のインストールvenv
のインストール
pyenv
をそのままインストールしても問題はないのだが,Node.js
や Go
などの他の環境も立てやすい anyenv
を入れ,そこから pyenv
をインストールする.
パスを通すのがわりと面倒なので,anyenv
でパスを通して, anyenv
を用いて pyenv
を入れるのもある.
まず,anyenv - GitHub からクローン
$ git clone https://github.com/anyenv/anyenv ~/.anyenv
$ git clone https://github.com/anyenv/anyenv ~/.anyenv Cloning into '/home/take/.anyenv'... remote: Enumerating objects: 505, done. remote: Counting objects: 100% (109/109), done. remote: Compressing objects: 100% (66/66), done. remote: Total 505 (delta 54), reused 77 (delta 36), pack-reused 396 Receiving objects: 100% (505/505), 89.55 KiB | 2.98 MiB/s, done. Resolving deltas: 100% (234/234), done.
次に,anyenv
のPATHを通す
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(anyenv init -)"' >> ~/.bashrc
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile $ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
.bashrc
に書き込んだので,リフレッシュ
$ source .bashrc
$ source .bash_profile
$ source .bash_profile ANYENV_DEFINITION_ROOT(/home/take/.config/anyenv/anyenv-install) doesn't exist. You can initialize it by: > anyenv install --init $ ~/.anyenv/bin/anyenv init # Load anyenv automatically by adding # the following to ~/.bash_profile: eval "$(anyenv init -)"
本当に正しい .bashrc と .bash_profile の使ひ分け - Qiita を参考にすると,ログイン時に読み込むのが .bash_profile
なので,一度 shell を再起動する.
WSLのshell 再起動は,Windows 側から一度 $ wsl --shutdown
を行わないといけない
これで PATH が通ったので,anyenv
のインストール
$ anyenv install --init
$ anyenv install --init Manifest directory doesn't exist: /home/take/.config/anyenv/anyenv-install Do you want to checkout https://github.com/anyenv/anyenv-install.git? [y/N]: y Cloning https://github.com/anyenv/anyenv-install.git master to /home/take/.config/anyenv/anyenv-install... Cloning into '/home/take/.config/anyenv/anyenv-install'... remote: Enumerating objects: 71, done. remote: Counting objects: 100% (14/14), done. remote: Compressing objects: 100% (13/13), done. remote: Total 71 (delta 4), reused 4 (delta 1), pack-reused 57 Receiving objects: 100% (71/71), 13.15 KiB | 1.20 MiB/s, done. Resolving deltas: 100% (11/11), done. Completed! $ anyenv --version anyenv 1.1.5-1-g5c58783 $
できたので確認
$ anyenv install -l
Renv
crenv
denv
erlenv
exenv
goenv
hsenv
jenv
jlenv
kubectlenv
luaenv
nodenv
phpenv
plenv
pyenv
rbenv
sbtenv
scalaenv
swiftenv
tfenv
$
多くの環境が anyenv
で構築できることがわかる.
一応,anyenv
の GitHub にもリンクがあるので,メンテナンスはされているのではなかろうか.
以下,GitHub と同様.
$ mkdir -p $(anyenv root)/plugins
$ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
$ mkdir -p $(anyenv root)/plugins $ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update Cloning into '/home/take/.anyenv/plugins/anyenv-update'... remote: Enumerating objects: 87, done. remote: Total 87 (delta 0), reused 0 (delta 0), pack-reused 87 Receiving objects: 100% (87/87), 13.33 KiB | 1.67 MiB/s, done. Resolving deltas: 100% (33/33), done. $ anyenv update Updating 'anyenv'... Updating 'anyenv/anyenv-update'... Updating 'pyenv'... | From https://github.com/pyenv/pyenv | 9a4f9c25..20189ff0 master -> origin/master Skipping 'pyenv/python-build'; not git repo Updating 'anyenv manifest directory'... $普通にアプデ出来ているので適宜活用していきたい.
anyenv
があるので,
$ anyenv install pyenv
だけでサクッと終了. $SHELL をリロードして PATH を通す
$ source .bashrc
$ anyenv install pyenv /tmp/pyenv.20230406161623.3277 ~ Cloning https://github.com/pyenv/pyenv.git master to pyenv... Cloning into 'pyenv'... remote: Enumerating objects: 22989, done. remote: Counting objects: 100% (536/536), done. remote: Compressing objects: 100% (183/183), done. remote: Total 22989 (delta 419), reused 398 (delta 343), pack-reused 22453 Receiving objects: 100% (22989/22989), 4.67 MiB | 6.82 MiB/s, done. Resolving deltas: 100% (15557/15557), done. Updating files: 100% (1071/1071), done. ~ Install pyenv succeeded! Please reload your profile (exec $SHELL -l) or open a new session. $ anyenv --version anyenv 1.1.5-1-g5c58783 $ pyenv --version pyenv 2.3.17 $
anyenv
とpyenv
が動作していることがわかる
pyenv - GitHub のwikiにある通り, pyenv
が Python
を Build するためのインストールを済ませる.
$ sudo apt update; sudo apt install -y build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
$ pyenv install -l
で pyenv
がインストールできる Python
の一覧が表示できる.
$ pyenv install -l Available versions: 2.1.3 2.2.3 2.3.7 2.4.0 (中略) stackless-3.4.2 stackless-3.4.7 stackless-3.5.4 stackless-3.7.5 $
pyenv
で Python
をインストールする (以下の例は 3.9
系)
$ pyenv install 3.9
なお
3.9
系で最新のものを入れたい場合は,3.9
のように省略する$ pyenv install 3.9 Downloading Python-3.9.16.tar.xz... -> https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tar.xz Installing Python-3.9.16... Installed Python-3.9.16 to /home/take/.anyenv/envs/pyenv/versions/3.9.16 $ pyenv versions * system (set by /home/take/.anyenv/envs/pyenv/version) 3.9.16 $
この状態では pyenv
が Python
を保持しているので,環境に導入する.
$ pyenv global
だと環境全体に適応されるが,$ pyenv local
だと特定のディレクトリ配下のみ利用するバージョンの設定になる. - pyenv 利用のまとめ - Qiita
$ pyenv global 3.9 $ python --version Python 3.9.16 $ pip --version pip 22.0.4 from /home/take/.anyenv/envs/pyenv/versions/3.9.16/lib/python3.9/site-packages/pip (python 3.9) $
Python
と同時にpip
もダウンロードされて環境に適応されていることがわかる.
venv
は module
のバージョンなどの情報を記録,適応できる Python
の標準機能である.
$ cd [プロジェクト用フォルダのパス]
$ python -m venv [新しい環境名]
$ source [環境名]/bin/activate
$ deactivate
誤って venv
で管理している以外の場所 (全体の PyPI
) にインストールした場合は綺麗に消し去りたい.
$ pip freeze > piplist.txt
$ sudo pip uninstall -r piplist.txt
$ rm piplist.txt
$ pyenv install 3.9.0
Downloading Python-3.9.0.tar.xz...
-> https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tar.xz
Installing Python-3.9.0...
patching file Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst
patching file configure
patching file configure.ac
BUILD FAILED (Ubuntu 22.04 using python-build 2.3.17)
Inspect or clean up the working tree at /tmp/python-build.20230406165646.1409
Results logged to /tmp/python-build.20230406165646.1409.log
Last 10 log lines:
checking for python3... python3
checking for --enable-universalsdk... no
checking for --with-universal-archs... no
checking MACHDEP... "linux"
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/tmp/python-build.20230406165646.1409/Python-3.9.0':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
$
BUILD FAILED (Ubuntu 22.04 using python-build 2.3.17)
ってなって失敗したが,コレと同じエラーで
configure: error: no acceptable C compiler found in $PATH
Cのコンパイラのエラーっぽいので,ビルドツールをインストール
$ sudo apt install build-essential
再びエラー
$ pyenv install 3.9.0
Downloading Python-3.9.0.tar.xz...
-> https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tar.xz
Installing Python-3.9.0...
patching file Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst
patching file configure
patching file configure.ac
BUILD FAILED (Ubuntu 22.04 using python-build 2.3.17)
Inspect or clean up the working tree at /tmp/python-build.20230406170837.3553
Results logged to /tmp/python-build.20230406170837.3553.log
Last 10 log lines:
File "/tmp/python-build.20230406170837.3553/Python-3.9.0/Lib/ensurepip/__init__.py", line 210, in _main
return _bootstrap(
File "/tmp/python-build.20230406170837.3553/Python-3.9.0/Lib/ensurepip/__init__.py", line 129, in _bootstrap
return _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
File "/tmp/python-build.20230406170837.3553/Python-3.9.0/Lib/ensurepip/__init__.py", line 38, in _run_pip
return subprocess.run([sys.executable, "-c", code], check=True).returncode
File "/tmp/python-build.20230406170837.3553/Python-3.9.0/Lib/subprocess.py", line 524, in run
raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['/tmp/python-build.20230406170837.3553/Python-3.9.0/python', '-c', '\nimport runpy\nimport sys\nsys.path = [\'/tmp/tmptfco8p_m/setuptools-49.2.1-py3-none-any.whl\', \'/tmp/tmptfco8p_m/pip-20.2.3-py2.py3-none-any.whl\'] + sys.path\nsys.argv[1:] = [\'install\', \'--no-cache-dir\', \'--no-index\', \'--find-links\', \'/tmp/tmptfco8p_m\', \'--root\', \'/\', \'--upgrade\', \'setuptools\', \'pip\']\nrunpy.run_module("pip", run_name="__main__", alter_sys=True)\n']' returned non-zero exit status 1.
make: *** [Makefile:1254: install] Error 1
$
エラーの原因がよくわからなかったが,wiki をよく読んでいないためだった. インストールに必要な基本パッケージを入れて解決.
環境変数への理解不足 .bash_profile
, .bashrc
の違いをちゃんと理解すべし.
$ pyenv --version
Command 'pyenv' not found, did you mean:
command 'p7env' from deb libnss3-tools (2:3.68.2-0ubuntu1.2)
Try: sudo apt install <deb name>
$ anyenv --version
anyenv: command not found
$ source .bash_profile
$ anyenv --version
anyenv 1.1.5-1-g5c58783
$ pyenv --version
pyenv 2.3.17
$
- Pythonの仮想環境構築
- Python環境構築[Pyenv+Poetry]
- その実験、再現できますか?pyenvとpoetryによる “そんなに頑張らない” 再現可能な実験環境構築
- Pythonのパッケージ管理ベストプラクティス - Qiita
- anyenvとpyenvでPythonをインストールする - Qiita
- WSL2 + VScode + nodenv(anyenv)の環境構築方法まとめ - Qiita
- オールインワンな開発環境をanyenvで構築する
Footnotes
-
経験則的に言うと
Apple Sillicon
を使うなら,Python 3.9
以上を使うことを強く勧める.参考: M1 Mac にnumpy, matplotlibなどが入らない問題の解消法 - Qiita ↩