python2.7のnativeモジュールをビルドするのにMSVC9(VisualStudio2008)ではなく、 MSVC15(VisualStudio2017)とかを使うには。

本当はPythone.exeをビルドしたコンパイラにバージョンを合わせた方がいいのかもしれないが、古いC++でコンパイルできるようにコードを修正するのが嫌なので。 例。

# setup.py
from distutils.core import setup, Extension

iex = Extension('iex', sources = ['PyIex/iexmodule.cpp'])

setup (name = 'pyalembic',
       version = '1.0',
       description = 'python binding of Alembic',
       ext_modules = [iex])
> python.exe setup.py build
running build
running build_ext
building 'iex' extension
error: Unable to find vcvarsall.bat

vs2008をインストールしていないのでエラーになる。 調べたところdistutils/mvsc9compiler.pyのfind_vcvarsallを置き換えればよさそう。

# monkey patch for msvccompiler
import distutils.msvc9compiler
def find_vcvarsall(version):
    return "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Auxiliary/Build/vcvarsall.bat"
distutils.msvc9compiler.find_vcvarsall=find_vcvarsall


from distutils.core import setup, Extension
import os

iex = Extension('iex', 
                sources = ['PyIex/iexmodule.cpp'],
                include_dirs = [
                    os.environ['VCPKG_DIR']+'/installed/x64-windows/include',
                    os.environ['VCPKG_DIR']+'/installed/x64-windows/include/openexr'
                    ],
                library_dirs=[
                    os.environ['VCPKG_DIR']+'/installed/x64-windows/lib'
                    ],
                libraries=[
                    'Iex-2_2',
                    ]
                )

setup (name = 'pyalembic',
       version = '1.0',
       description = 'python binding of Alembic',
       ext_modules = [iex])

VS2017のコンパイラでビルドできた。