はじめに
AllenNLPはいいぞ、、、 と聞いたので早速使ってみよう!としたらインストールに詰まったので原因と解決法です。インストール時に必要となる jsonnetをビルドする際に失敗する という問題ですが、結論から言うと、
- 低いバージョン(High Sierra等)からのMacOS Mojaveへのアップグレードする際のC++ヘッダーの自動インストール漏れ
が原因です(元からMojaveがインストール済のMacBookの友人はすんなりインストールできたらしい、、、)。限定的な想定ですが、今後のMac OS Xのメジャーアップデートでも似た問題が発生する可能性はあるので、また調べ直さないように記事にします。
※OSの仕様による問題なのでMacの人向けです
問題
いろいろな導入方法があるのですがAnacondaを使ったやり方にします。
$ conda create -n allennlp python=3.6
# 3.6系最終版である3.6.9が勝手に指定されてインストールされます
$ conda activate allennlp
# 環境を切り替え
(allennlp) $ pip install allennlp
AllenNLP公式githubの説明では、「まっさらなPython3.6の環境を作ってpip install
すればいいよ!!」って書いてあるので実行します。
...
Building wheel for jsonnet (setup.py) ... error
ERROR: Complete output from command //anaconda3/bin/python -u -c 'import setuptools, tokenize;__file__='"'"'/private/var/folders/q3/t9f6dwcd7qbfwhp4h3tn4ffm0000gn/T/pip-install-7bksxwcr/jsonnet/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /private/var/folders/q3/t9f6dwcd7qbfwhp4h3tn4ffm0000gn/T/pip-wheel-ab5wiufe --python-tag cp37:
ERROR: running bdist_wheel
running build
running build_ext
c++ -c -g -O3 -Wall -Wextra -Woverloaded-virtual -pedantic -std=c++0x -fPIC -Iinclude -Ithird_party/md5 -Ithird_party/json core/desugarer.cpp -o core/desugarer.o
c++ -c -g -O3 -Wall -Wextra -Woverloaded-virtual -pedantic -std=c++0x -fPIC -Iinclude -Ithird_party/md5 -Ithird_party/json core/formatter.cpp -o core/formatter.o
...
失敗します。 なんかC++周りでエラーが出てる???Pythonなのに???(情弱並感)
解決法
ググって見るとこの問題は割とよく起こっているみたいで、AllenNLPのGithub Issueでも話題に上がっています。このIssueによるとGoogleのjsonnetのIssueが参考になるよ!って書いてあります。さらにこの記事ではこのStackOverflowが役に立つよ!って書いてありました。たらい回しにしないで答えを書いて♡
どうやらMojave向けのC++のヘッダーがインストールされていないために参照エラーが発生しているらしく、
$ open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
でヘッダーをインストールすれば解決するそうです。パッケージインストーラーが起動して指示通りに進めればOKです。自分はこの方法で解決しました。
インストールが終わって仮想環境内でpip install allennlp
すれば晴れてAllenNLP導入完了です!!
余談
もしヘッダーのパッケージ(macOS_SDK_headers_for_macOS_10.14.pkg)が見つからない場合はDLする必要があるみたいですが、その方法は次の記事で紹介されています。
こちらの記事によると、
そもそも,macではCやC++のコンパイラはXCode由来のようで,OSアプデをした後にXCodeもアプデをしたのですが,そのアプデ内容に 「Mojave用のmacOS SDK headerがデフォルトで入っていないのが原因」みたいです.
普段からC++を書いてる人は気づきそうですがC++環境が元からインストールされている環境をバックエンド的に使ってると気づきませんね、、、
まとめ
- C++によるパッケージビルド時のヘッダー参照エラーが原因
- この問題はMojaveでC++を使ってビルドする他のパッケージでも起こりうる
- 手動でヘッダーをインストールすれば解決
- アップグレード時に自動でされるはずのパッケージインストールがされていないのが根本の原因
- 今後のメジャーアップデート時にも似た問題が起こるかもしれない