PythonでCSPADEを使えるpycspadeのインストールで「error: command ‘gcc’ failed with exit status 1」にハマった

「系列パターンマイニング」について調べていて、
C-SPADEというアルゴリズムをPythonで使えるpycspadeというライブラリを見つけたので使ってみる。
インストールでハマったのでまずはインストールについて。

環境

  • macOS 10.13.6
  • Python 3.7.1
  • conda 4.5.12
  • pip 19.0.3
  • Homebrew 2.0.2

TLDR;

error: command 'gcc' failed with exit status 1エラーでpip経由でのインストールができなかったのが、Homebrew経由で最新のgcc(8.3)をインストールし、パスを通したらインストールがうまくいった。

やったことまとめ


$ brew install gcc
$ ln -s /usr/local/bin/gcc-8 /usr/local/bin/gcc
$ ln -s /usr/local/bin/g++-8 /usr/local/bin/g++
$ vi ~/.zprofile

# 以下を追記
export PATH=$PATH:/usr/local/bin

$ source ~/.zprofile
$ gcc -v
$ pip install Cython pycspade

以降は試行錯誤していたメモ。

pip install→コケる

ドキュメントに沿って、

$ pip install Cython pycspade

するも早速コケる。

エラーメッセージは↓のような感じ。

fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
error: command 'gcc' failed with exit status 1


Command "/anaconda3/bin/python -u -c "import setuptools, tokenize;__file__='/private/var/folders/yj/zvgpdc556qb6f5dxptcstrrw0000gn/T/pip-install-be6hkeoe/pycspade/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /private/var/folders/yj/zvgpdc556qb6f5dxptcstrrw0000gn/T/pip-record-x_00avdf/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /private/var/folders/yj/zvgpdc556qb6f5dxptcstrrw0000gn/T/pip-install-be6hkeoe/pycspade/

読むに、gcc周りでエラーが起きている?

まず、gccがインストールされているか確認


$ which gcc
/usr/bin/gcc

pipをアップデートする

$ pip install -U pip

condaもアップデート

$ conda update conda

→ 結果は変わらず。

xcode-selectのインストールも試す

こちらの記事にて記載されていた、Xcodeのインストールも試してみる。

$ xcode-select --install

インストーラが立ち上がるので、そのままインストール
→ 結果は変わらず。


別の記事で目にした下記コマンドも走らせてみる。

$ brew install pkg-config libffi
$ export PKG_CONFIG_PATH=/usr/local/Cellar/libffi/3.0.13/lib/pkgconfig/

→ 結果は変わらず。

ここで、xcode-selectのgccでは動かないだけでは? という仮説が湧いたので、homebrewのgccを使ってみる。

homebrew経由でgccの最新版をインストールし、パスを書き換える


$ brew install gcc

gccのエイリアスを探す

$ ls /usr/local/bin | grep gcc

gcc-8
gcc-ar-8
gcc-nm-8
gcc-ranlib-8
x86_64-apple-darwin17.7.0-gcc-8
x86_64-apple-darwin17.7.0-gcc-8.3.0
x86_64-apple-darwin17.7.0-gcc-ar-8
x86_64-apple-darwin17.7.0-gcc-nm-8
x86_64-apple-darwin17.7.0-gcc-ranlib-8


$ ls /usr/local/bin | grep g++

g++-8
x86_64-apple-darwin17.7.0-g++-8

エイリアスにシンボリックリンクを貼る

$ ln -s /usr/local/bin/gcc-8 /usr/local/bin/gcc
$ ln -s /usr/local/bin/g++-8 /usr/local/bin/g++

パスを通し、適用

$ vi ~/.zprofile

# 以下を追記
export PATH=$PATH:/usr/local/bin

$ source ~/.zprofile

※bashを使っているなら、.bash_profileなどを書き換える


うまく通っているか確認

$ gcc -v

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/8.3.0/libexec/gcc/x86_64-apple-darwin17.7.0/8.3.0/lto-wrapper
Target: x86_64-apple-darwin17.7.0
Configured with: ../configure --build=x86_64-apple-darwin17.7.0 --prefix=/usr/local/Cellar/gcc/8.3.0 --libdir=/usr/local/Cellar/gcc/8.3.0/lib/gcc/8 --disable-nls --enable-checking=release --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-8 --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-isl=/usr/local/opt/isl --with-system-zlib --with-pkgversion='Homebrew GCC 8.3.0' --with-bugurl=https://github.com/Homebrew/homebrew-core/issues --disable-multilib
Thread model: posix
gcc version 8.3.0 (Homebrew GCC 8.3.0)

ここまでやった上で、再度インストールを試みる。

$ pip install Cython pycspade

→ インストール成功!

というわけで…
元々入っていたgcc、xcode-selectでインストールしたgccのバージョンが古かったのが原因だと思われる。(古いバージョンが何だったかはメモるのを忘れていたが、おそらく4.x系だった気がする…)

肝心のpycspadeを使ってのアレコレは次回以降。

参考