WindowsでCaboCha-Python3バインディング

この記事は、[CaboCha & Python3の環境構築(Windows版)](https://qiita.com/ayuchiy/items/17a2d48116b2da7535eb)でCaboCha-Python3バインディングスのコンパイルに、必要なC++コンパイラについて、ドはまりしていろいろ調べたことをメモしたものです。
~~いまだに正解はわかっていないので、誤りがあればご指摘ください。~~
無事、解決しました

## 結論
Windows・Python3系でPythonからCaboChaを使いたいのに、うまくいかずに検索しまくっている人は、

1) **32bit版**のPython入っていることを確認し、違ったら入れなおす。
2) Mecabも公式サイトの**32bit版exe**をインストール。善意で配布されている64bit版はNG。
3) CaboChaも公式サイトの**32bit版exe**をインストール。(ソースも使うのでダウンロードしておく)
4) **PythonのバージョンにあったBuild Tools / Visual Studio**を入れる。
 
これをきっちり守れば、きっとうまくいくと思います。

## 必要なVisual Studioのバージョンについて
　使用しているWindows版Pythonがコンパイルされた時の**Visual C++**のバージョンに合ったコンパイラをインストールする必要がありました。
　MaCabやCaboChaのバインドでハマった先人のQAや記事には、Build Toolsではだめだったとか、Visual Studio 2015で入れてうまくいったとか、2017を入れてうまくいったとか、レジストリに書き込んでうまくいったとか色んな情報がありますが、大事なポイントは**インストールオプションでC++を選択**してしていることと、**Visual C++のバージョン**でした。

以下、[WindowsCompilers] (https://wiki.python.org/moin/WindowsCompilers)より、抜粋・加筆

| CPython                          | Visual C++ | Visual StudioやBuild Toolsのバージョン              |
|:--------------------------------:|:----------:|:---------------------------------------------------|
| 3.7                              |14.1        | Build Tools for Visual Studio 2017<br>Visual Studio 2017 |
| 3.5<br>3.6                       |14.0        | Build Tools for Visual Studio 2017<br>Visual Studio 2017<br>Visual C++ Build Tools 2015<br>Visual Studio 2015|
| 3.3<br>3.4                       |10.0        |Windows SDK 7.1<br>Visual Studio 2010               |
| 2.6<br>2.7<br>3.0<br>3.1<br>3.2  |9.0         |Visual C++ Compiler for Python 2.7<br>Windows SDK 7.0<br>Windows SDK 6.1<br>Visual Studio 2008   |

　例えばPython 3.6の場合、必要なC++のバージョンは14.0で、Visual Stdio 2015または2017をインストールすれば当該バージョンのC++がインストールされます。(なお、Visual Studioによっては、C++ 15.0など他のバージョンも入ります)

 Windows版Pythonをコンパイルした時のC++のバージョンは、以下のようにして調べることができます。

```python:C++コンパイラバージョンの調べ方
from distutils.msvc9compiler import *
get_build_version()
```

今回インストールした、32bit版のpython 3.7.1で実行してみたところ、以下のように出力されました。
できればBuild ToolsまたはVisual Studio 2017からC++ 14.1をインストールするとよいことがわかりました。
(2017のインストールパスにC++ 14系がなければ2015のC++インストールパスを探しに行くため2015でも可)

```:Python3.7での実行例
C:\test> python
Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:05:16) [MSC v.1915 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from distutils.msvc9compiler import *
>>> get_build_version()
14.1
```




## うまくいったVisual C++のコンパイラ

 最終的に、Python 3.7(32bit版) + MeCab(32bit版) + CaboCha(32bit版)でうまく環境作れた時のVisual C++は、Build Tools for Visual Studio 2017のもの。
 [Visual Studioのダウンロードサイト] (https://visualstudio.microsoft.com/ja/downloads/)の、下部にある「すべてのダウンロード」から「Tools for Visual Studio 2017」を開いて、Build Tools for Visual Studio 2017のWeb Installerをダウンロード。
※Visual Studioを開発環境として使いたい人は、上のVisual Studio Community 2017でよいと思います。

![vs_all.png](https://qiita-image-store.s3.amazonaws.com/0/321544/5b2bd452-c128-97fb-96f2-ba2e9d541995.png)

　Web Installerを起動するとBuild Toolsの場合、下記画面のようなオプションが表示されます。
　**Visual C++ Build Tools**にチェックを入れ、右側のペインに、VC++ 2017 version 15.9 V14.16 latest V141 toolsがあるのを確認して、インストールします。
　なお、今回、ディスクに制約のある環境(Surface / Win 10)で試したので、容量を最小限にすべく、Windows 10 SDKやCMake用ツールなど、デフォルトで選択されているオプションは全て外してみましたがC++のインストールも問題なく、CaboChaバインドもできました。
　ただし、別のWindows 7の環境では、Windows 10 SDKとCMakeのVisual C++ツールが必須でした。CaboChaバインドコンパイル時に必要なheaderファイルが入っておらず、エラーになりました。基本的に、オプションはそのままインストールしたほうがよさそうです。

![vs_installer_r.png](https://qiita-image-store.s3.amazonaws.com/0/321544/2d9281a9-60f4-da58-741c-9b50e4f14398.png)

(Visual Studio用のWeb Installerの場合は、Community, Professional, EnterpriseなどEditionの選択肢が表示されるので、Communityを選んでインストールしてください。またはVisual Studio用のインストーラーからでも、「個別のコンポーネント」から、VC++ 2017 version 15.9 V14.16 latest V141 toolsだけ選択してインストールすることができます。)


## 試行錯誤の黒歴史　ぶち当たった主なエラー
* **cabocha-pythonコンパイル時に、python setup.py installするとUnable to find vcvarsall.batエラーがでる**<br>→ 必要なC++のバージョンが入っていない。<br>少なくともPython 3.6/3.7は、C++のバージョンごとに、ほぼpath決め打ちでvcvarsall.batが探しに行っているため、目的のバージョンが入っていないとエラーになる。<br>vcvarsall.batの場所にpathを通したり、レジストリに値をかいたり、pythonがvcvarsall.batを探すスクリプトにpathをハードコードしたり系のworkaroundは、多分不要になるはず。


* **python setup.py installでコンパイルが始まるが、外部シンボルhogehogeが未解決です*エラーが大量発生して失敗**<br>→CaboChaは32bitだが、MeCabやPythonが64bit版になっている。たぶん、それが原因です。


## 振り返ってみて
　自分の場合、VS 2010 / 2015をインストールしたことありC++は歴代バージョン勢ぞろいで、過去に入れたMeCabがさりげなく64bit版で、Pythonも64bit版だった状態からスタートしたため、何を信じていいやら、バージョンの組み合わせにドはまりしました。

　Mecabは32bit版入れなおしたものの、Pythonは最初64bit版のまま、Visual Studioの問題だと思って、2015と2017を入れたり消したり、Build ToolsにしたりVisual Studio本体入れたり。そのあとは、しばらくPythonのせいだと気が付かず、手詰まりに。
  Windows 7で動かした他の方のブログがPython 2系だったり、Python 3系だと思ったらLinuxだったり、これで動いたというビンゴの情報がなかったのもあって、切り分けられずに、迷走してしまいした。
　結局、その何度もインストール・アンインストールを繰り返す中で、「プログラムの追加と削除」でふとPython 64bitって書いてあること気が付いて、無事に解決できました。めでたしめでたし。