python setup.py install
の実行時にCython拡張機能をビルドするようにコンパイラーを明示的に強制する方法はありますか? setup.py
の形式は次のとおりです。
import os.path
import numpy as np
from setuptools import setup, find_packages, Extension
from Cython.Distutils import build_ext
setup(name='test',
packages=find_packages(),
cmdclass={'build_ext': build_ext},
ext_modules = [ Extension("test.func", ["test/func.pyx"]) ],
include_dirs=[np.get_include()]
)
Anaconda 3.16、Python 3.4、setuptools 18、Numpy 1.9、Cython0.24を使用してWindows8.1 x64にパッケージをインストールしようとしています。デプロイメントスクリプトはCythonから採用されています wiki および this スタックオーバーフローの回答。
Makefile.bat
:: create and activate a virtual environement with conda
conda create --yes -n test_env cython setuptools=18 pywin32 libpython numpy=1.9 python=3
call activate test_env
:: activate the MS SDK compiler as explained in the Cython wiki
cd C:\Program Files\Microsoft SDKs\Windows\v7.1\
set MSSdk=1
set DISTUTILS_USE_SDK=1
@call .\Bin\SetEnv /x64 /release
cd C:\test
python setup.py install
問題は、この場合、setup.py install
がMSWindows SDK7.1ではなくcondaに含まれているmingwコンパイラを使用していることです。
したがって、DISTUTILS_USE_SDK=1
とMSSdk=1
はbuidに影響を与えていないようです。 condavirtualenv内からMSSDKをアクティブ化することがここで問題になる可能性があるかどうかはわかりません。
python setup.py build_ext --compiler=msvc
を実行すると、MSコンパイラで拡張機能が正しくビルドされますが、その後setup.py install
を実行すると、mingwで再度コンパイルされます。同じことがpython setup.py build --compiler=msvc
にも当てはまります。
また、上記のリンクの回答で説明されているように%COMSPEC% /E:ON /V:ON /K "%PROGRAMFILES%\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd"
を実行しようとしましたが、私にとっては、黄色で色付けされた新しいターミナルプロンプトが生成され、インストールプロセスが停止します。
たとえば、setup.py
を編集することによって、このパッケージをビルドするためにコンパイラを強制する方法はありますか?
Distutilsの(デフォルトの)コマンドライン引数は、setup.cfg
(setup.py
と並行して配置)と呼ばれる別のファイルで提供できます。詳細については、 docs を参照してください。コンパイラを設定するには、次のようなものを使用します。
[build]
compiler=msvc
python setup.py build
を呼び出すことは、python setup.py build --compiler=msvc
を呼び出すことと同じです。 (python setup.py build --compiler=someothercompiler
を呼び出すことにより、distutilsに他のコンパイラーを使用するように指示することもできます)
これで、(distutilsにamsvcコンパイラを使用するように指示することに成功しました。残念ながらそれを伝えるオプションはありませんwhich使用するmsvcコンパイラ。基本的に2つのオプションがあります。
1つ:何もしないと、distutilsはvcvarsall.bat
を見つけて、それを使用して環境をセットアップしようとします。 vcvarsall.bat
(および環境を設定するコンパイラ)はVisual Studioの一部であるため、動作させるにはインストールしておく必要があります。
Two:Windows SDKをインストールし、distutilsにそれを使用するように指示します。 DISUTILS_USE_SDK
という名前は(少なくとも私の意見では)かなり誤解を招くことに注意してください。実際には、distutilsにSDK(およびsetenv.bat
)を使用して環境をセットアップするように指示するのではなく、distutilsが環境がすでにセットアップされていると想定する必要があることを意味します。そのため、OPで示したように、ある種のMakefile.bat
を使用する必要があります。
サイドノート:VisualStudioまたはWindows SDKの特定のバージョンは、対象のpythonバージョンによって異なります。
備考として:Linuxでは、autoconf環境変数の多くを使用できます。コンパイラー用
CC=mpicc python setup.py build_ext -i
私の場合、トリックを見つけました。MSVC14.1(buildtools 2017)ではなくMSVC14.0(buildtools 2015から)を使用したかったのです。ファイルLib\distutils_msvccompiler.pyを編集しました。方法があります
_find_vcvarsall
呼び出しています
best_version, best_dir = _find_vc2017()
この呼び出しをに置き換えました
best_version, best_dir = _find_vc2015()
コンパイルしたら、この汚いトリックを元に戻すことを忘れないでください。