Python pipenv で pywin32 をインストールするとエラー

11/10 頃から、 Python でpypiwin32 や pywin32 パッケージや、それらに依存しているパッケージを pipenv にてインストールしようとすると、

AttributeError: module 'site' has no attribute 'getsitepackages'

とエラーが出て失敗するようになった。

原因

直接的な原因は、 pipenv ではなく virtualenv にある。

pywin32 v226 で pywin32_bootstrap.py が site.getsitepackages を内部で使うようになった ようなのだが、 pipenv が内部で使っている virtualenv モジュールが作る仮想環境内の site モジュールは getsitepackages 関数を持っていない。
このため、 virtualenv で作成した仮想環境内で pywin32 をインストールさせようとすると、上記のエラーが発生してしまう。

しかも、これは以下のコメントにあるように、 virtualenv の不具合ではなく意図的な仕様であると認識されているようだ。

The problem (as I understand it) is that virtualenv implements its own version of site.py that doesn’t track the core Python version perfectly […]
Fixing this isn’t as simple as “sync up to the core site.py”, because we need to support multiple Python versions, and site.py has changed between them.

2.6 から 3.8 まで幅広い Python バージョンをサポートする virtualenv は、 コアライブラリーの site.py に仕様を追従させるのが難しいとコメントされている。

更に、 virtualenv ではなく、 Python 3.3 以上のコアライブラリーに含まれる venv を使って仮想環境を作成すれば、本問題は発生しない。
(このため、 pipenv と競合の poetry では仮想環境の作成に venv を使っているため、本問題に遭遇しない)

このことも、 virtualenv の方を修正する動機が強くならない要因だろう。

暫定的な回避方法

もし、直接 virtualenv を使って仮想環境を作っていたのであれば、 venv で作り直せばよい。

一方、 pipenv を使っているなど、 virtualenv を使うことが避けられないのであれば、 前述のように、問題の原因となる pywin32 のコード変更は v226 で行われたため、 v225 以下を使用すればよい。

ここで話をややこしくしているのは、過去からの慣習で、 pip などで pywin32 をインストールするとき、 pypiwin32 を参照していることが多い点だ。
せっかく pypiwin32 で使用バージョンを固定していても、その依存関係によってインストールされる pywin32 の実態は、最新版になってしまうのだ。

このため、以下のように、パッケージのバージョンに pywin32 を v225 以下とする条件を加えたり、

 docker = "==4.1.0"
+pywin32 = "<=225"
 docker==4.1.0
+pywin32<=225

pypiwin32 でバージョン指定している部分を pywin32 に書き換えるのがよいだろう。

-pypiwin32 = "==223"
+pywin32 = "==225"
-pypiwin32==223
+pywin32==225

恒久対策

すでに pywin32 のモジュールの法で Issue が立っている。

本来なら、 virtualenv で site.getsitepackages を使えるようにするか、 python 3.3 以上の場合は pipenv 側で (virtualenv ではなく) venv 使うようにしてくれればよいのだが、 多分しばらくはそんな修正は入らないだろうし、 pywin32 が対応してくれることを待つしかないのだ。

pip install in virtualenv breaks virtualenv · Issue #2460 · docker/docker-py · GitHub
https://github.com/docker/docker-py/issues/2460
docker で既に問題になってるし、さっさと直さないと今後あちこちで問題になってきそう。。。

AWX をインストールした後の Server Error を解決したかった話

この記事は、 Ansible AWX をインストールしたときに、 Server Error に なったりならなかったりする 問題に対処したときのポエムだ。

はじめに断っておくが、最終的に AWX 8.0.0 で解消しているっぽいものの、 原因や正確な条件などは不明なままである。
また後述するが、 (タイトルに反して)おそらく Ansible AWX の問題ではなく、 postgres:9.6 の docker イメージの問題ではないかと思われる。

発生した問題の状況

続きを読む