Tech

Docker環境でPython+TA-Libのエラーに遭遇した時に試したこと(と解決策)

Python 3.7 で以下のエラーにハマった時に読む記事です。

ImportError: libta_lib.so.0: cannot open shared object file: No such file or directory

ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C header, got 80 from PyObject

上記エラーに遭遇して、下記の方法をいろいろ試しましたが、ちゃんと解決できたとはいえません…。とりあえず回避する方法だけなら、記事の末尾を参照。

実行環境は下記の通りです。

  • Docker Python公式イメージ(3.7-buster
  • Python 3.7.3
  • TA-Lib 0.4.19

 

TA-Lib(Python)のインストール方法

まずは基本的なインストール方法を確認しておきます。

PythonでTA-Libを使うには、TA-Lib本体をインストールした上で、TA-LibのPythonラッパーをインストールする必要があります。

素直に pip install するだけでは使えないので、注意です。

インストール手順は下記の通り実行していきます。TA-Libのソースをダウンロードしてコンパイルします。

curl -L http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz -O
tar xzvf ta-lib-0.4.0-src.tar.gz
cd ta-lib
./configure --prefix=/usr
make
sudo make install

※実際にはDockerfileでやっています。
これを行なった上で、pip install します。

pip install Ta-Lib

これで import talib で使えるはずです。

そのはずでした。

実行してみると、以下のエラー。

ImportError: libta_lib.so.0: cannot open shared object file: No such file or directory

 

試したこと1. ldconfigの追加

調べてみると、以下のように ldconfig の設定追加で解消しそう。

echo "include /usr/local/lib" >> /etc/ld.so.conf
ldconfig 

すると以前のエラーは出なくなりましたが、今度は以下のようなエラーに遭遇しました。

ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C header, got 80 from PyObject

みたところ numpy 関連のエラーのようですね。

 

試したこと2. numpyのダウングレード

メッセージ内容から推察するに、バージョン対応ができていないっぽいので、numpy のバージョンを古いものに変更してみることに。

とりあえず1.16にダウングレード(バージョン変更)してみます。

pip install numpy==1.16.1

結果変わらず。他のバージョンでも一通り試してみても、ダメでした。

 

最終的に(解決策)

Pythonのバージョンを3.8に変更しました。

Dockerイメージをpython:3.8-busterでビルドしなおし、上記手順どおりにインストールしたところあっさり実行できました。TA-LibとPython3.7の相性が原因なのは考えにくいですが、3.7のイメージに含まれる処理系の過不足とかかもしれませんね。

環境を変えてしまっているので直接的な解決策ではないですが、今回はとりあえず動けばよかったので、これにてクローズ。

 

-Tech
-,

© 2021 スターレイヴ