mod_wsgi インストール時の not supported wheel on this platform 対処法

4 min read読了の目安(約2400字

経緯

環境を作っては壊してやっているうち、雑にApacheとPythonをインストールして雑にmod_wsgiをインストールしようとしたら、次のようなエラーが出て進めず。

PS C:\Apache24> pip install .\mod_wsgi-4.7.0+ap24vc14-cp35-cp35m-win_amd64.whl
mod_wsgi-4.7.0+ap24vc14-cp35-cp35m-win_amd64.whl is not a supported wheel on this platform.

環境

  • Windows Server 2016
  • Apache==2.4
  • Python==3.5
  • mod_wsgi==4.7.0

結論

エラーメッセージでご指摘の通り、環境が合っていなかった。
ちなみに、GitHubのmod_wsgiのページには、ビルド済みパッケージを利用する際は環境を厳密にあわせること、と注意書きがある。

詳細

そもそも、mod_wsgiをインストールする際はいつもこちらの記事にお世話になっている。
Python Windows で mod_wsgi を Apache に組み込む方法

上記の記事に記載のある通り、Unofficial Windows Binaries for Python Extension Packagesからビルド済みのパッケージをダウンロードする際、

mod_wsgi-[mod_wsgiのバージョン]+ap[apacheのバージョン]vc[Visual Studio compiler のバージョン]-cp[Pythonのバージョン]-cp[Pythonのバージョン]m-win[OSのビット数].whl

で選ばなければならないが、いつも「これかな」でうまくいっていたので、いざ通らなくなると焦る。上記はApache側とPython側の大きく2つに分けられる。

Apache側(apXXvcYY)

apXX

こちらは簡単。Apacheをダウンロードしてきたサイト(Apache Lounge)に書いてある。

vcYY

ここで勘違い。てっきり、自分のPCにいれてあるVC++ランタイムのバージョンのことかと思って、VC++ランタイムをいろいろインストールし直したりしたがうまくいかない。
Apacheのバイナリをビルドした際に使用されたVC++ランタイムのバージョンのことだった。
どのVC++ランタイムでビルドされたかは、Apache Loungeにちゃんと書いてある。

2020年9月現在、mod_wsgiのバイナリは最新でもVC14対応になっている(一方、VC++の最新はVC16)。なので、過去のリリースから少し古いApacheをインストールする必要がある。

Python側(cpXX-cpYYm-winZZ)

インストールされたPythonに合うかどうか、どうやって判断するのか謎だった。

答えは、Pythonコンソールを開くとそこに大体書いてある。

PS C:\Apache24> python
Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.

また、コンソール中で、

from pip._internal.utils.compatibility_tags import get_supported
get_supported()
[<cp35-cp35m-win_amd64 @ …>, <cp35-abi3-win_amd64 @ …>, <cp35-none-win_amd64 @ …>, <cp34-abi3-win_amd64 @ …>, <cp33-abi3-win_amd64 @ …>,

のように確認できる。自環境では、cp35-cp35m-win_amd64でよいことがわかる。

世の中の多くの記事には、

from pip._internal.pep425tags import get_supported

のように書いてあるが、Python2系以降ではpep425tagsは無くなっているようだ。
参考:Python-Control 環境構築 & whlファイル インストールエラー対応

反省

  • もうちょっと英語をちゃんとよむ。
  • あんまり雑に環境を作らない。