web-dev-qa-db-ja.com

実行時にコンパイラを強制するpython setup.py install

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=1MSSdk=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を編集することによって、このパッケージをビルドするためにコンパイラを強制する方法はありますか?

24
rth

Distutilsの(デフォルトの)コマンドライン引数は、setup.cfgsetup.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バージョンによって異なります。

16
PeterE

備考として:Linuxでは、autoconf環境変数の多くを使用できます。コンパイラー用

CC=mpicc python setup.py build_ext -i
2
Fred Schoen

私の場合、トリックを見つけました。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()

コンパイルしたら、この汚いトリックを元に戻すことを忘れないでください。

2
B.Bocquet