「Unable to find vcvarsall.bat」の対処法

「Unable to find vcvarsall.bat」の対処法
目次

C/C++などのビルドが必要なファイルを含むPythonパッケージをWindows環境下でインストールしようとすると「Unable to find vcvarsall.bat」とエラーになることがあります。

Pythonパッケージにビルドが必要なファイル(pure Python以外のC/C++など)が指定されている場合はインストール時にコンパイルが必要です。Windows環境ではデフォルトでPython本体をコンパイルしたVC++と同じバージョンのVC++を呼ぼうとします。そのため、Python本体をコンパイルしたバージョンのVC++がないとエラーになります。

2014-07-05: VC++、Windows SDKの情報を追加しました。2014-09-28: Express Edition、9.0のvcvarsall.batの情報を追加しました。2014-11-28: Visual C++ Compiler for Python 2.7の情報を追加しました。2017-07-02: Visual Studio Dev Essentialsへリンクを修正しました。

VC++のバージョンの確認

Python本体をコンパイルしたVC++のバージョンはインタラクティブシェルを起動した時やsys.versionで確認できます。

>>> import sys
>>> sys.version
'2.7.6 (default, Nov 10 2013, 19:24:24) [MSC v.1500 64 bit (AMD64)]'

このとき「MSC v.AAB0」のAA部がメジャーバージョン+6、B部がマイナーバージョン*10を表しています。MSC v.1500なら、メジャーバージョンが15-6=9、マイナーバージョンが0/10=.0、つまりVC++9.0(VC++2008)でPython本体がコンパイルされたとわかります。

VC++の製品ごとのバージョンはWikipediaに一覧表があります。

対処法

VC++がインストールされていない場合は、まずVC++をインストールしましょう。Python本体をコンパイルしたバージョン同じVC++をインストールすれば追加の設定は必要ありません。

Python 2.7の場合

MicrosoftがPython 2.7用のコンパクトなVC++ 9.0コンパイラMicrosoft Visual C++ Compiler for Python 2.7を配布しています。インストール場所は、%LOCALAPPDATA%\Programs\Common\Microsoft\Visual C++ for Python9.0になります。

VC++ for Python 2.7を使う場合はsetuptoolsのバージョン6以上が必要です。古い場合は以下のコマンドでアップデートが必要です。

pip install -U setuptools

Python 2.7以外の場合または通常のVC++が必要な場合

Visual Studio(有料)、Visual Studio Express Edition(無料)、Windows SDK(無料)から入手可能です。各バージョンのVisual Studio Express EditionのダウンロードはVisual Studio Dev Essentialsで提供されています。

IDEは不要でコンパイラのみでよいという人にはWindows SDKからの入手が最適です。

VC++ 9.0(2008)の注意点

Visual Studio(Express Edition)に含まれるvcvarsall.batはx64環境でのツールへのパスが間違っておりValueError: [u'path']というエラーになることがあります。また、Windows SDK 7.0に含まれるVC++ 9.0(2008)にはvcvarsall.batが付属していないという問題があります。ただし、Visual C++ Compiler for Python 2.7の場合は問題ありません。

問題がある場合、パスを修正したvcvarsall.batをVC++のインストールディレクトリ(デフォルトではC:Program Files (x86)Microsoft Visual Studio 9.0VC)においてください。

別バージョンのVC++を使う設定

もし、Python本体をコンパイルしたバージョンと違うVC++がインストールされている場合はそちらを使うように設定をすることで無事にコンパイルできるようになります。

実際にパッケージのビルド時にVC++を呼び出しているコードは以下の場所にあります。

PYTHON_ROOT/Lib/distutils/msvc9compliler.py

内部の処理ではレジストリやVS*COMNTOOLS環境変数を使ってVC++の場所を調べています。つまり、VS*COMNTOOLS環境変数で別のバージョンのVC++を指定してあげると、そちらを使ってコンパイルをしてくれます。

例えば、Python本体がMSC v.1500、つまりVC++9.0(2008)でコンパイルされているとします。手元にインストールされているVC++が11.0(2012)の場合、以下のように環境変数をセットしてやるとVC++11.0を使ってコンパイルしてくれます。

set VS90COMNTOOLS=%VS110COMNTOOLS%

2018-12-09: Pythonの拡張はCインターフェースなので、コンパイラのバージョンが違ってもPython本体とのABI互換性が期待できます。