symbol not found in flat namespace ‘_TA_ACOS’ のエラーを回避した際の備忘録

プログラミング,python

やりたかったこと

株価の自動売買システムを作ってみようと思い立ち、色々と調べて見たところ「ta-lib」というライブラリがよく使われているとのことことでした。

試しに動かしてみようと思ったところinstall時にちょっとつまづいたので対処した手順を備忘録として残しておこうと思います。

実行環境

実行環境は以下の通り。

  • MacBook Air (M1,2020)
  • メモリ:8G
  • macOS Sonoma14.0
  • 仮想環境:Anaconda
  • Python:3.8.12

実行したコード(インストールからimportまで)

ta-libをconda installコマンドで入れられるという情報があったので以下のコマンドを実行しました。

conda install ta-lib

成功したかと思いきや、失敗していたのでbrew install をした後にpip installをしました。

brew install ta-lib
pip install ta-lib

これはこれでsuccesfull していたのですが、importするとエラーが発生しました。

import talib as ta

エラー内容「symbol not found in flat namespace '_TA_ACOS'」

上記のようにimport talib を実行するとエラーが発生。

symbol not found in flat namespace '_TA_ACOS'

色々試していたのですが、手元のWindowsだとこのエラーが出なかったのでもしかしたらM1macで発生する問題っぽい?

解決策

参考になったサイトとして、issueが切られていてそこに解決策のヒントがありました。

https://github.com/TA-Lib/ta-lib-python/issues/408

https://github.com/TA-Lib/ta-lib-python/issues/635

結論以下のコードを実行しました。

conda install -c conda-forge ta-lib

結論「conda-forge」を使うとうまく行くようです。

「-c conda-forge」 とは

  • -c はchannelの略で、Condaに特定のチャネルからパッケージを探してインストールするように指示します。
  • conda-forge はCondaのチャネルの一つで、コミュニティ主導で多くのパッケージが提供されている場所です。
「conda-forge」をさらに詳しく

https://conda-forge.org/docs/user/introduction.html

conda-forgeが出てくるまでは以下のような問題がありました。

  • パッケージが多くのチャネルに散らばっているため、パッケージを見つけるのが困難。
  • チャネル間でパッケージを組み合わせることは、バイナリの非互換性のためにエラーが発生する可能性がある。
  • チャネルが更新されていない場合、新しいチャネルを見つける必要がある。

それを解決するために作られたのがconda-forgeのようです。

【補足】Windowsの場合]

Mac OSではなく、Windowsでpipでta-libをインストールしようとした場合、以下のようなエラーがでました。

error: subprocess-exited-with-error

  × Building wheel for ta-lib (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [20 lines of output]
      running bdist_wheel
      running build
      running build_py
      creating build
      creating build\lib.win-amd64-cpython-38
      creating build\lib.win-amd64-cpython-38\talib
      copying talib\abstract.py -> build\lib.win-amd64-cpython-38\talib
      copying talib\deprecated.py -> build\lib.win-amd64-cpython-38\talib
      copying talib\stream.py -> build\lib.win-amd64-cpython-38\talib
      copying talib\__init__.py -> build\lib.win-amd64-cpython-38\talib
      running build_ext
      building 'talib._ta_lib' extension
      creating build\temp.win-amd64-cpython-38
      creating build\temp.win-amd64-cpython-38\Release
      creating build\temp.win-amd64-cpython-38\Release\talib
      "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\HostX86\x64\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -Ic:\ta-lib\c\include -IC:\Users\***\AppData\Local\Temp\pip-build-env-svdqsmtv\normal\Lib\site-packages\numpy\core\include -IC:\Users\***\anaconda3\envs\stock_price_analysis\include -IC:\Users\***\anaconda3\envs\stock_price_analysis\Include "-IC:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\ATLMFC\include" "-IC:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\cppwinrt" /Tctalib/_ta_lib.c /Fobuild\temp.win-amd64-cpython-38\Release\talib/_ta_lib.obj
      _ta_lib.c
      talib/_ta_lib.c(1080): fatal error C1083: include ファイルを開けません。'ta_libc.h':No such file or directory
      <string>:77: UserWarning: Cannot find ta-lib library, installation may fail.
      error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.27.29110\\bin\\HostX86\\x64\\cl.exe' failed with exit code 2
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for ta-lib
Failed to build ta-lib
ERROR: Could not build wheels for ta-lib, which is required to install pyproject.toml-based projects

これも今回と同じようにconda forgeのコマンドで無事インストールすることができました。