Python じゃなくて VisualStudio 側の問題のようなのだけど、setup.py でネイティブモジュールをビルドするときに顕在化したので。
こういう感じのネイティブモジュールを作った。
とするとエラーになる。 Windows10(64bit)上の vs2017 + vcbuildtools の組み合わせの環境である。
distutils が cl.exe を探すのに失敗しているようなのである。 lib/distutils 下を調べてみた。 どうやら lib/distutils/_msvccompiler.py で vcvarsall.bat から環境変数を得ることに失敗しているらしい。 実際、C:\Program Files (x86)\Microsoft Visual Studio\Shared\14.0\VC\vcvarsall.bat の呼び出しが失敗していることを突き止めた。
コマンドラインから実行しても失敗していて、vcvarsall.bat に以下のコードがあるのだが、
C:\Program Files (x86)\Microsoft Visual Studio\Shared\14.0\VC\vcvarsall.bat から C:\Program Files (x86)\Microsoft Visual C++ Build Tools\vcbuildtools.bat” への相対パスだと一致しないよなーと。 これが原因で cl.exe のパスが取れない。 setup.py にモンキーパッチを当てて cl.exe を発見できるようにしてみた。 以下を setup.py の先頭に追加。
monkey patch for _msvccompiler
distutils.\_msvccompiler.\_get_vc_env=\_get_vc_env
以前にもこんなことやったことあるような気がする・・・。