2015-10-25 19 views
19

python setup.py installを実行しているときに、Cython拡張をビルドするためにコンパイラを明示的に強制する方法はありますか? 、私はアナコンダ3.16、Pythonの3.4を使用して、Windows 8.1のx64上のパッケージをインストールしようとしているPythonを実行するときにコンパイラを強制するsetup.py install

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()] 
) 

、numpyの1.9とCython 0.24を18 setuptoolsの:setup.pyの形式です。デプロイメントスクリプトは、Cython wikithis Stack Overflowの回答に基づいています。

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はまだ代わりにMSのWindows SDK 7.1 1のcondaに含まれてmingwのコンパイラを使用したことです。

  • のでDISTUTILS_USE_SDK=1MSSdk=1はBUIDに影響を与えていないようです。私は、conda virtualenv内からMS SDKをアクティブにすることがここで問題になるかどうかはわかりません。

  • 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を編集するなどして、このパッケージをビルドするためのコンパイラを強制的に強制する方法はありますか?

+2

コンパイラがパッケージをビルド/再構築して何が起こるかを強制するには、 'python setup.py build_ext --compiler = msvc --force'を実行してみてください。 – romeric

+0

@romericしたがって、 'build_ext'はMS VCを期待通りに拡張します(' --force'フラグの有無にかかわらず)。問題は、 'install'を実行するとmingwで再構築されることです。 – rth

答えて

14

distutilsのコマンドライン引数は、setup.cfgsetup.pyに平行)という別のファイルに指定できます。詳細については、docsを参照してください。コンパイラの使用にのようなものを設定するには:今すぐpython setup.py buildを呼び出す

[build] 
compiler=msvc 

python setup.py build --compiler=msvcを呼び出すことと同じです。 MSVCコンパイラを使用する

今、あなたは(成功した監督しているのdistutilsを(あなたはまだ直接のdistutilsがpython setup.py build --compiler=someothercompilerを呼び出すことによって、他のコンパイラを使用することができます)。残念ながら MSVCコンパイラが使用することを指示するオプションはありません。

ワン:基本的に2つのオプションがあります。は何もしないとはdistutilsがvcvarsall.batを特定しようとセットアップに環境をそれを使用しますがvcvarsall.bat(およびコンパイラは、それがために環境を設定)されているのVisual Studioの一部なので、あなたはそれが働くためにそれをインストールしなければなりません。

2つ: Windows SDKをインストールし、それを使用するようにdistutilsに指示します。 DISUTILS_USE_SDKという名前は(少なくとも私の意見では)かなりミスリーディングであることに注意してください。実際には、distutilsに環境をセットアップするためにSDK(そしてそれはsetenv.bat)を使用するように指示するのではなく、distutilsが環境がすでに設定されていると仮定する必要があります。そのため、OPに表示されているように、ある種のMakefile.batを使用する必要があります。

サイドノート:特定のバージョンのVisualStudioまたはWindows SDKは、対象のPythonバージョンによって異なります。

+1

あなたの答えをお寄せいただき、 'setup.cfg'でコンパイラを指定すると、Windowsで問題が解決されます。問題は、このファイルを単に追加するだけでLinux上のインストールが中断され、MS VCではなくgccコンパイラが使用されることです。もちろん、実行時に 'setup.cfg'を生成する可能性がありますが、より柔軟な' setup.py'を通してコンパイラオプションをハックすることが可能かどうかは疑問です... – rth

+1

補足として:私はあなたがdistutilsをハックしてあなたが望むことをすることができたとしましょう、我々は結局Pythonについて話しています。ターゲットとするポイントは、おそらく 'build_ext'コマンドであり、変更されたバージョンを再作成する場合や、既存のものを変更する場合があります。しかし、distutils全体がかなり複雑で(恐らく事の性質に由来し、避けられなかった)、最初の一見で理解するのが難しいというのは私の印象です。 MSコンパイラの設定はむしろ畳み込まれており、後方互換性を壊す恐れがあるため、しばしば触れられていません。(私の意見と推測) – PeterE

+0

'setup.cfg'はユーザが完全に制御しているファイルです。コードと共に配布するべきではありません。 –

0

注意:Linuxでは、autoconf環境変数の多くを使用できます。コンパイラの場合

CC=mpicc python setup.py build_ext -i 
関連する問題