Windowsで普通に pip install pycocoapi
としようとして色々詰まったのでメモ。
(以下の内容は主に https://github.com/cocodataset/cocoapi/issues/51 にあるトラブルシューティング+α。Qiitaにある他の記事も参照したけど、コンパイラフラッグが足りなくてビルドがコケたので、いろいろ足した。)
基本はgitでクローンしてビルド
そもそもgitが入ってないときはgit for windows。
git clone https://github.com/cocodataset/cocoapi.git
で、ビルドしようとして多分間違いなくコケる。
cd cocoapi\PythonAPI
python setup.py build_ext install
# 以下エラーメッセージがいろいろ
ので、ここからはエラーメッセージの内容に応じてトラブルシューティング。
1. cl.exe がない
error: command 'cl.exe' failed: No such file or directory
みたいなエラーメッセージが出たら、cl.exeがPATHにない。
一番簡単な解決法は、Visual Studioをインストールして、開発者コマンドプロンプトを使う。(インストールの仕方はいろんな記事があるのでそちらを参照。)
ちなみに開発者コマンドプロンプトにはいろんな種類があるが、今回はx64 Native Toolsコマンドプロンプトを使う。
起動するには、Visual Studioをインストールした上で、検索バーでx64 Native
と打てば出てくる。
2. Wno-cpp が使えない
さて、VS2017用 x64 Native Toolsコマンドプロンプトを起動して、
cd cocoapi\PythonAPI # cocoapiをgitでクローンしたパス
python setup.py build_ext install
を実行すると、invalid numeric argument '/Wno-cpp'
みたいなエラーメッセージが出る。(ちなみにそれ以前にpythonがないというエラーが出る場合は、pythonのPATHが通っていない。)
なので、cocoapi\PythonAPI\setup.py
の14行目あたりにある、extra_compile_args
を以下のように空にする。
extra_compile_args=[],
#extra_compile_args=['-Wno-cpp', '-Wno-unused-function', '-std=c99'],
書き換えたら再度トライ。
3. math.h がない、basetsd.h がない等々
今度はヘッダファイルが足りないと言われるので、さらにcocoapi\PythonAPI\setup.py
のinclude_dirs
を以下のように書き換える。
include_dirs = [np.get_include(), '../common', 'C:/Program Files (x86)/Windows Kits/10/Include/10.0.17763.0/ucrt', 'C:/Program Files (x86)/Windows Kits/10/Include/10.0.17763.0/winrt','C:/Program Files (x86)/Windows Kits/10/Include/10.0.17763.0/um','C:/Program Files (x86)/Windows Kits/10/Include/10.0.17763.0/shared'],
#include_dirs = [np.get_include(), '../common'],
- ※1:
10.0.17763.0
の部分はWindowsのバージョンによって異なるので、エクスプローラーでC:\Program Files (x86)\Windows Kits\10\Include
の中身を確認して存在するバージョンに書き換える必要がある。 - ※2: もし
C:\Program Files (x86)\Windows Kits
の中身が存在しない場合は、Visual Studio InstallerからWindows 10 SDKを追加する必要がある。
4. kernel32.lib がない
さて今度はリンカフラッグが足りないので、include_dirs
の次の行に以下を書き足す。
library_dirs = ['C:/Program Files (x86)/Windows Kits/10/Lib/10.0.17763.0/um/x64','C:/Program Files (x86)/Windows Kits/10/Lib/10.0.17763.0/ucrt/x64'],
※ 10.0.17763.0
の部分に関しては先程と同様。(もしx64コマンドプロンプトじゃなくてx86コマンドプロンプトを使ってる場合は、x64をx86に書き換える必要があると思う。)
ちなみに最終的なsetup.pyはこんな感じ。
from setuptools import setup, Extension
import numpy as np
# To compile and install locally run "python setup.py build_ext --inplace"
# To install library to Python site-packages run "python setup.py build_ext install"
ext_modules = [
Extension(
'pycocotools._mask',
sources=['../common/maskApi.c', 'pycocotools/_mask.pyx'],
include_dirs = [np.get_include(), '../common', 'C:/Program Files (x86)/Windows Kits/10/Include/10.0.17763.0/ucrt', 'C:/Program Files (x86)/Windows Kits/10/Include/10.0.17763.0/winrt','C:/Program Files (x86)/Windows Kits/10/Include/10.0.17763.0/um','C:/Program Files (x86)/Windows Kits/10/Include/10.0.17763.0/shared'],
library_dirs = ['C:/Program Files (x86)/Windows Kits/10/Lib/10.0.17763.0/um/x64','C:/Program Files (x86)/Windows Kits/10/Lib/10.0.17763.0/ucrt/x64'],
extra_compile_args=[],
)
]
setup(
name='pycocotools',
packages=['pycocotools'],
package_dir = {'pycocotools': 'pycocotools'},
install_requires=[
'setuptools>=18.0',
'cython>=0.27.3',
'matplotlib>=2.1.0'
],
version='2.0',
ext_modules= ext_modules
)
5. rc.exe がない
これが最後の砦。C:\Program Files (x86)\Windows Kits\10\bin\x64
をPATHに追加して、もう一度x64 Native Toolsコマンドプロンプトを開き直し、同じコマンドを実行すればOK。
( もしPATHにこのフォルダを追加したくない場合は、中にある rc.exe
と rcdll.dll
だけをコピーしてPATHの通ったフォルダに置けばOK。)
6. やっとビルドが通る
あぁ長い道のりだった。ちゃんとインストールできてるかは以下のコマンドでわかる。
python
>>> from pycocotools.coco import COCO
>>>
エラーが出なければOK。