Pythonインストール(ランチャー + poetry)

Pythonを公式インストーラよりインストールし、poetryも使えるようにする方法。

前提

  • Windows 10
  • Python 3.9 とか 3.10 とかそのへん(少なくとも3.6以上)
  • poetry 1.1.12

ツールとかの前提知識

poetryはPythonの仮想環境作成・パッケージ依存管理ツールの1つ。
似たような用途のはかれこれいっぱいあるけど、とりあえず最近(2021年)はこれが持て囃されているっぽい。実際使いやすい。

pyenvなどのようにpython自体のバージョンを切り替える機能はないが、 仮想環境を作るときにpython.exeも自環境にコピーするため、 その時点でPCに該当バージョンのPythonが入っていれば複数バージョンを共存させることもできる。

ただし、記事の傾向を見るとやはりpyenvと一緒に使っている人が多い感じがする。
もちろん、LinuxやMacではPythonのバージョン切り替え手段がそれしかないこともあるが、Windowsでも以下に挙げられる理由から、使いたくなる事情がある。

  • Windows公式インストーラでは、python.exeにパスを通さない方法が推奨されている(ランチャーを使う)
  • poetryはいくつかのスクリプトが'python'にパスが通っていることを前提としている
  • →普通に使おうとすると'python'が見つからないとエラーになる

issueは上がっているが、なんだかんだまだ解消はされていないようである。

pyenvを使えば、'python'に仮想的にパスを通しつつ、Pythonのバージョンを楽に切り替え可能になるので相性がいい。

だが、個人的には……

  • エラーの発生リスクから、なるべく環境構築系ツールに多く依存することは避けたい
  • Windowsではpyenv自体は動かないためpyenv-winという本家からフォークされた別のツールとなり、余計に危うい感じがする(偏見)
  • ぶっちゃけツールの数が増えるたびに使い方覚えるの面倒くさい

Python公式のランチャーによるバージョン管理はシンプルながらも十分便利なので、可能ならpyenvは使わず、poetryを導入するだけで済ませたい。

以下、それを何とかする方法を書いているが、なんか逆に面倒くさい方法を敢えてとっている感じはある。
もう少し待てば、ランチャーでも快適に使えるようになるといいな。

インストール手順

Pythonインストール

公式インストーラ落として実行して特に何も考えず進めていくと入る。

インストール場所

たとえば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が開く。紛らわしいので無効にもできる。

Pythonインストール後

一応、pipをアップデートしておく。

また、次のために、certifiパッケージを入れておく。

> py -m pip install --upgrade pip
> py -m pip install certifi

poetryインストール

公式でインストーラが用意されている。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‚Ü‚½‚ÍŠO•”ƒRƒ}ƒ“ƒhA            (←文字化けしてるけどたぶん、
  ‘€ì‰Â”\‚ȃvƒƒOƒ‰ƒ€‚Ü‚½‚̓oƒbƒ` ƒ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

特定のバージョンのPythonで仮想環境を作成したい

とりあえず、PCに目的のバージョンがインストールされている状態にする。
Pythonのダウンロード一覧から目的のバージョンのインストーラをダウンロード・実行する。

ランチャーでPythonを管理する方法をとる場合、次の場合だけは諦めないといけない。

  • 直インストールされている環境を残したまま、それとマイナーバージョンが同じでマイクロバージョンが異なるバージョンのPythonで環境を作成する

つまり、たとえば

  • 3.9.9で仮想環境を構築したいとする
  • 3.9.5など、マイナーバージョンまでが同じものをPCに直インストール済み
  • 3.9.5の環境は残したままにしたい

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ではなくて環境名になるので、それで上手くいくといいんだけど……(試してない)。

PyCharmのTerminalからの実行

原因がよくわかっていないが、独立した Command Prompt や PowerShell からなら上記の方法でいけるのに、
Python用IDE PyCharmのツールとして組み込まれているTerminalから poetry の何らかのコマンドを動かすと、上記と同様のEnvCommandErrorが発生する。

Terminalも、実態は裏でCommand Prompt や PowerShellを起動させ、IDEの同一ウィンドウ内に表示させているだけだと思うのだが、、、

その際に、よしなに思って何らかの環境変数を自動的に設定されるようになっているのが悪さをしているのかもしれない。
また、この現象は自分の環境だけかもしれない。

ひとまず、PowerShellを単独で立ち上げればいけているので、それで妥協する。

programming/python/install_poetry.txt · 最終更新: 2022/01/19 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0