Pythonを公式インストーラよりインストールし、poetryも使えるようにする方法。
poetryはPythonの仮想環境作成・パッケージ依存管理ツールの1つ。
似たような用途のはかれこれいっぱいあるけど、とりあえず最近(2021年)はこれが持て囃されているっぽい。実際使いやすい。
pyenvなどのようにpython自体のバージョンを切り替える機能はないが、 仮想環境を作るときにpython.exeも自環境にコピーするため、 その時点でPCに該当バージョンのPythonが入っていれば複数バージョンを共存させることもできる。
ただし、記事の傾向を見るとやはりpyenvと一緒に使っている人が多い感じがする。
もちろん、LinuxやMacではPythonのバージョン切り替え手段がそれしかないこともあるが、Windowsでも以下に挙げられる理由から、使いたくなる事情がある。
issueは上がっているが、なんだかんだまだ解消はされていないようである。
pyenvを使えば、'python'に仮想的にパスを通しつつ、Pythonのバージョンを楽に切り替え可能になるので相性がいい。
だが、個人的には……
Python公式のランチャーによるバージョン管理はシンプルながらも十分便利なので、可能ならpyenvは使わず、poetryを導入するだけで済ませたい。
以下、それを何とかする方法を書いているが、なんか逆に面倒くさい方法を敢えてとっている感じはある。
もう少し待てば、ランチャーでも快適に使えるようになるといいな。
exeの場所は、Pythonインストーラデフォルト設定では C:\Users\(UserName)\AppData\Local\Programs\Python\Python310
。310はバージョンによって変わる。
以下はそれをせずに何とかしようとしているが、ぶっちゃけパスを通すデメリットって個人では 「これまで3.9にパスを通していて、新しく3.10をインストールしたときに修正し忘れて、ずっと古い3.9を使い続けてしまいがち」 くらいしかない気がするので、あまり拘泥するところでもない、、、。少なくとも労力に見合ってない。
公式インストーラ落として実行して特に何も考えず進めていくと入る。
たとえばPython3.9なら、%AppData%\Local\Programs\Python\Python39
に入る。
Pythonでは、「3.9.5」みたいなバージョン番号のうち、
2番目のバージョン(例だと3.9)までは自動的に分けてインストールされる。
3番目は主にバグフィックスなどのため、新しい方に上書きされる。
また、AppData以下ということからもわかる通り、ユーザー毎にそれぞれ独立のものがインストールされる。
公式インストーラからデフォルト設定のままインストールした場合、
コマンドプロンプトなどで「python」コマンドが使えるようになるわけではなく、
代わりに「py」(実態は C:\Windows\py.exe
)が使えるようになる。
これは「ランチャー」と呼ばれるもので、 ユーザ別、また3.8と3.9など複数バージョンを同時にインストールしている時に役立つ。
特定のpython.exeを環境変数で「python」コマンドに紐づけてしまうと 他のバージョンを使いたくなった時に面倒だが、ランチャーなら切り替えて使いやすくなる。
一方で、ネット上の解説記事のコマンド例などで「python xxx.py」みたいなのがあった場合、 「py xxx.py」に読み替えて実行する必要がある。
ちなみにWindows10では「python」コマンドはMicrosoft Storeが開く。紛らわしいので無効にもできる。
一応、pipをアップデートしておく。
また、次のために、certifiパッケージを入れておく。
> py -m pip install --upgrade pip > py -m pip install certifi
公式でインストーラが用意されている。Pythonで書かれているので、インストールしたてのPythonで実行する。
上記の通りに進めていくと……残念ながら初手、Powershell上でこのコマンドを実行してくださいとあるところで罠がある。
なので、次のようにする。
まず、Powershellコマンドの中、インストールスクリプトを取得するURL (執筆時点は https://install.python-poetry.org)から、スクリプトを直接ダウンロードする。
スクリプトを書き換える。外部へのアクセス時、使うべき証明書の位置を教えてやる。
[冒頭の適当な場所に追加] import ssl import certifi [800行目あたりを変更] # with closing(urlopen(request)) as r: # ↓ with closing(urlopen(request, context=ssl.create_default_context(cafile=certifi.where()))) as r:
スクリプトを実行する。
> py ./path/to/install-poetry.py
これで入るはず。
インストール後のコメントでも説明されるが、%AppData%\Roaming\Python\Scripts
を環境変数のPathに追加する。
> poetry --version Poetry version 1.1.12
OK!
仮想環境の実体が入ったフォルダ(python.exe, 各パッケージ)を、
各プロジェクト直下の .venv
に作成するようにできる。
> poetry config virtualenvs.in-project true
デフォルトでは %AppData%\Local\pypoetry\Cache\virtualenvs
以下に作成される。
1か所で管理するのは、妥当といえば妥当なのだが、、、
パッケージなんてちょっと時間がたてばすぐ何らかが更新され、 常に後方互換性が崩れるリスクがあるわけで、1プロジェクト1仮想環境とした方が気が楽、という考え方もある。
毎回パッケージを独立に用意するので容量の肥大化が難点だが、 まぁ多く見積もって数GBだし、環境が壊れた時の影響範囲を考慮してどちらをとるか、という感じ。
または、基本的にはプロジェクト配下に個々に環境を作りつつ、 複数プロジェクトから使い回したい環境に関してはpoetryを使わず別途venvなどで構築して外から使う、といった運用も(ややこしくなるが)一つの手。
他の解説記事を参考にパッケージ管理を楽しみましょう。
と言いたいところだが、ここでもpythonにパスが通っていないことでエラーが発生する。
(project.tomlなどを作成した後、poetry installすると) > poetry install EnvCommandError Command python -W ignore - errored with the following return code 1, and output: 'python' ÍAàR}hܽÍOR}hA (←文字化けしてるけどたぶん、 ìÂ\ÈvOܽÍob` t@CƵÄF¯³êĢܹñB pythonというコマンドがないぞというメッセージ) input was : import sys if hasattr(sys, "real_prefix"): print(sys.real_prefix) elif hasattr(sys, "base_prefix"): print(sys.base_prefix) else: print(sys.prefix) at ~\AppData\Roaming\pypoetry\venv\lib\site-packages\poetry\utils\env.py:1183 in _run 1179│ output = subprocess.check_output( 1180│ cmd, stderr=subprocess.STDOUT, **kwargs 1181│ ) 1182│ except CalledProcessError as e: → 1183│ raise EnvCommandError(e, input=input_) 1184│ 1185│ return decode(output) 1186│ 1187│ def execute(self, bin, *args, **kwargs):
ランチャーから、モジュールとして実行してやればいい。
> py -m poetry install Updating dependencies Resolving dependencies... Writing lock file
とりあえず、PCに目的のバージョンがインストールされている状態にする。
Pythonのダウンロード一覧から目的のバージョンのインストーラをダウンロード・実行する。
ランチャーでPythonを管理する方法をとる場合、次の場合だけは諦めないといけない。
つまり、たとえば
3.9.5を上書きやアンインストールしていいのなら問題ない。
まぁ、仮想環境を使うのであれば普通、直インストールされている方はあまり触らないはずなので、どうしても残したいという状況はあまり無いはず。
マイクロバージョンまで分けて管理したい場合は、pyenvなどを導入する必要がある。
無理やりやるなら、Python3.9.5の入ったインストールフォルダ Python39
を一時的に名前変更し、改めて3.9.9をインストールしてpoetryで仮想環境構築した後、アンインストールし、名前変更を元に戻す、なんてことをすればいけるかも?(未検証)
その上で以下のようにすれば入るかなと思いきや、 これでは「poetryをインストールしたときに使用したpython」が入る。
◆3.8.2で仮想環境構築したいとする。PCにはインストール済, project.tomlでも指定済 > py -3.8 -m poetry install ◆確認 > poetry run python --version Python 3.9.9 ←違うバージョンで環境が作られている
以下のようにする。
仮想環境を作るディレクトリをプロジェクト直下にしている場合(virtualenvs.in-project=true)。
プロジェクトのルートディレクトリで、venvを目的のバージョンのpythonで起動し、「.venv」という名前の環境を作る。
> py -3.8 -m venv .venv
そのうえでinstallすると、目的のバージョンが入る。
この場合はpoetryが.venvを見つけて使ってくれるので、モジュール起動する必要はない。
> poetry install > poetry run python --version Python 3.8.2
プロジェクト直下にしていない場合も似たようなことをすればいいと思うが、 作成するフォルダ名が.venvではなくて環境名になるので、それで上手くいくといいんだけど……(試してない)。
原因がよくわかっていないが、独立した Command Prompt や PowerShell からなら上記の方法でいけるのに、
Python用IDE PyCharmのツールとして組み込まれているTerminalから poetry
の何らかのコマンドを動かすと、上記と同様のEnvCommandErrorが発生する。
Terminalも、実態は裏でCommand Prompt や PowerShellを起動させ、IDEの同一ウィンドウ内に表示させているだけだと思うのだが、、、
その際に、よしなに思って何らかの環境変数を自動的に設定されるようになっているのが悪さをしているのかもしれない。
また、この現象は自分の環境だけかもしれない。
ひとまず、PowerShellを単独で立ち上げればいけているので、それで妥協する。