Python-Control 環境構築 & whlファイル インストールエラー対応
Python で制御工学の計算をしてみようと思い、Python-Control のインストールを試みた際、苦労したので備忘録として記録しておく。苦労したポイントは以下の点である。ちなみに、Python に関して私の知識は初級レベルです。
・pip で slycot をインストールできない
・whl ファイルのインストール時にエラーが生じる
・whl ファイルインストール時の cpXX が分からない
開発環境
・windows 10(64bit)
・python 3.8.2(32bit版)
・pip 20.1
Python-Control 環境構築エラー(Windows)
Python-Control を使うために、コマンドプロンプトを用いて pip で以下の2つをインストールする必要がある。しかし「control」はインストールできたが、「slycot」はエラーでインストールできない。調べてみると mac ならば pip で問題なく簡単にインストールできるようだが、Windows ではエラーとなり上手くいかないようである。みなさん苦戦している様子。
py -m pip install control
py -m pip install slycot
コマンドプロンプトに表示された slycot インストール時のエラーは以下である(一部抜粋です)。
ERROR: Failed building wheel for slycot
Failed to build slycot
ERROR: Could not build wheels for slycot which use PEP 517 and cannot be installed directly
slycot インストール手段
slycot をインストール手段は主に以下の2通りがあるようです。
手段①
slycot のページに記載されている Dependencies をすべてインストールする
手段②
Python ライブラリ用のインストールバイナリを利用する
手段①については、下記のページを参照すると Dependencies に以下の記載がある(2020年5月19日時点)。これらの環境をすべて整えたら slycot をインストールできたという情報があった。しかし、数が多くて面倒くさそうなので私は断念した。
・Python 2.7, 3.5+
・NumPy
・scikit-build >=0.8.1
・cmake
・C compiler (e.g. gcc, MS Visual C++)
・FORTRAN compiler (e.g. gfortran, ifort, flang)
・BLAS/LAPACK (e.g. OpenBLAS, ATLAS, MKL)
手段②については、いわゆる Python ライブラリを直接インストールする手段である。pip でうまくインストールできないときや、非公式ライブラリのインストールする際に使われる手段のようである。方法は whl ファイルをダウンロードしてきて、コマンドプロンプトからインストールする。slycot の whl ファイルは下記のページからダウンロードできる。
whl ファイルインストール時のエラー
whl ファイルのインストールは、コマンドプロンプトを起動し、ダウンロードしてきた whl ファイルのあるフォルダに移動、pip install “ファイル名.whl” を実行の手順で行う。しかし、whl ファイルが何かよく分かっていない私はここで苦戦した。コマンドプロンプトで以下の処理を実行した。
py -m pip install slycot-0.3.5-cp37-cp37m-win_amd64.whl
その結果、以下のエラーが表示された。
WARNING: Requirement 'slycot-0.3.5-cp37-cp37m-win_amd64.whl' looks like a filename, but the file does not exist
ERROR: slycot-0.3.5-cp37-cp37m-win_amd64.whl is not a supported wheel on this platfor
エラーの内容を調べてみると、pipに対応していないバージョンのwhlはインストールができないようである。自分の開発環境に適したcpのwhlファイルでないとインストールできない。cp27やcp37、cp38と様々なバージョンがある。
cpバージョン確認
自分の開発環境がどのcpに対応しているのか確認した。調べてみるとPython上で以下のコードを記載して実行するとバージョン情報が得られるとのことである。
from pip._internal.pep425tags import get_supported
print(get_supported())
しかし、またもやエラーが出てくる。
表示されたエラーは以下である。どうやら「pip._internal.pep425tags」というモジュールが存在していないようである。
ModuleNotFoundError: No module named 'pip._internal.pep425tags'
そこでPythonがインストールされているフォルダの中身を確認し、このモジュールが存在しているかどうか調査した。調査の結果、「\Python\Python38-32\Lib\site-packages\pip\_internal」のディレクトリ内に「pep425tags.py」というファイルが存在していない。よくよく見てみると、上記の情報は「pip 10.0.1」の環境での情報であった。私の環境は「pip 20.1」である。
原因が分かったので「get_supported()」という関数が含まれるファイルがどこにあるのか調査した。その結果「\Python\Python38-32\Lib\site-packages\pip\_internal\utils」のディレクトリ内に「compatibility_tags.py」のファイルが存在し、このファイル内に関数「get_supported()」が存在することが分かった。
よってPython上で記載するコードを以下のように修正して実行した。
from pip._internal.utils.compatibility_tags import get_supported
print(get_supported())
その結果、以下のように表示された。これでインストールすべきwhlファイルのバージョンが分かった。
cp38-cp38-win32
whlファイルインストール(リトライ)
先ほど記載したページから「slycot-0.3.5-cp38-cp38-win32.whl」をインストールしてコマンドプロンプトで以下の処理を実行し、slycotのインストールに成功した!
C:\Users\(省略)\Python> py -m pip install slycot-0.3.5-cp38-cp38-win32.whl
Installing collected packages: slycot
Successfully installed slycot-0.3.5
あとがき
プログラミング関連において、開発環境のアップデートはどんどん繰り返されていくので、webに掲載されている情報は古くなっていきます。今回、pipのバージョンでそれを実感しました。
自分の開発環境に適した正しい情報を見つけることが重要だということ、、最後は自力で乗り越える気持ちが必要だということを感じました。私はwebの情報をみながらPythonを独学で扱っているので、webの情報を見るときは「その人が成功していても自分の環境ではそれが正しいとは限らない」と意識しようと思いました。
他の記事紹介
Python-Controlの環境が構築できたら、ぜひ下記の記事も参考にしてみてください。
以上
何かお役に立てたら、サポートしていただけると嬉しいです!モチベーションを高めて、アウトプットしていきます!