2015-10-25 10 views
19

Esiste un modo per forzare esplicitamente il compilatore per la creazione di estensioni Cython quando si esegue python setup.py install? Dove setup.py è della forma:Compilatore forzato quando si esegue 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()] 
) 

Sto cercando di installare un pacchetto su Windows 8.1 x64 utilizzando Anaconda 3.16, Python 3.4, setuptools 18, Numpy 1,9 e Cython 0,24. Lo script di distribuzione viene adattato dalla risposta di Overflow dello stack di Cython wiki e 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 

Il problema è che in questo caso setup.py install ancora in uso il compilatore MinGW incluso con conda invece del MS Windows SDK 7.1 uno.

  • Così il DISTUTILS_USE_SDK=1 e MSSdk=1 non sembrano avere un impatto sulla buid. Non sono sicuro che l'attivazione dell'SDK di MS all'interno di una conda virtualenv potrebbe essere un problema qui.

  • L'esecuzione di python setup.py build_ext --compiler=msvc crea correttamente l'estensione con il compilatore MS, ma successivamente esegue lo , ricompilandolo nuovamente con mingw. Lo stesso vale per python setup.py build --compiler=msvc.

  • Anche provato a funzionare %COMSPEC% /E:ON /V:ON /K "%PROGRAMFILES%\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" come discusso nella risposta collegata sopra, ma per me questo produce un nuovo prompt del terminale, colorato in giallo, e interrompe il processo di installazione.

C'è un modo di forzare il compilatore per la costruzione di questo pacchetto, per esempio, modificando il setup.py?

+2

Provare a utilizzare 'python setup.py build_ext --compiler = msvc --force' per forzare il compilatore a compilare/ricostruire il pacchetto e vedere cosa succede. – romeric

+0

@romeric Quindi 'build_ext' crea l'estensione con MS VC come previsto (sia con che senza il flag' --force'). Il problema è che quando eseguo l'installazione, viene ricostruito con mingw. – rth

risposta

14

È possibile fornire argomenti della riga di comando (predefinito) per distutils in un file separato denominato setup.cfg (collocato parallelamente allo setup.py). Vedere lo docs per ulteriori informazioni. Per impostare l'utilizzo del compilatore qualcosa come:

[build] 
compiler=msvc 

ora chiedono python setup.py build è equivalente a chiamare python setup.py build --compiler=msvc. (È ancora possibile distutils dirette ad utilizzare un altro compilatore chiamando python setup.py build --compiler=someothercompiler)

distutils Ora avete (diretto con successo da utilizzare un compilatore msvc. Purtroppo non c'è alcuna possibilità di raccontarla che compilatore msvc da usare. fondamentalmente ci sono due opzioni:

uno:. non fare nulla e distutils cercherà di localizzare vcvarsall.bat e l'uso che per l'installazione di un ambiente vcvarsall.bat (e il compilatore imposta l'ambiente per) sono parte di Visual Studio, in modo devi averlo installato per farlo funzionare

Due: Installare Windows SDK e indicare a distutils di usarlo. Essere consapevoli del fatto che il nome DISUTILS_USE_SDK è piuttosto fuorilegge (almeno a mio avviso).In effetti NON dice a distutils di usare l'SDK (ed è setenv.bat) per configurare un ambiente, piuttosto significa che distutils dovrebbe presupporre che l'ambiente sia già stato impostato. Ecco perché devi usare una specie di Makefile.bat come hai mostrato nell'OP.

Nota a margine: La versione specifica di VisualStudio o di Windows SDK dipende dalla versione di Python di destinazione.

+1

Grazie alla tua risposta, la specifica del compilatore in 'setup.cfg' risolve il problema su Windows. Il problema è che semplicemente aggiungendo questo file si interrompe l'installazione su Linux che dovrebbe usare il computatore gcc e non MS VC. Ovviamente è possibile generare 'setup.cfg' sul runtime, ma mi chiedo se sia possibile modificare l'opzione del compilatore tramite' setup.py', che sarebbe più flessibile ... – rth

+1

Come ripensamento: I Supponiamo che tu possa incidere distutils per fare ciò che desideri, stiamo parlando di Python, dopo tutto. Il punto di destinazione sarebbe probabilmente il comando 'build_ext', come nel ricreare una versione modificata o derivarne una esistente. È mia impressione, tuttavia, che l'intera distutilla sia piuttosto complessa (che probabilmente deriva dalla natura della cosa, e non era evitabile) e quindi difficile da capire a prima vista. Il setup del compilatore MS è piuttosto complicato e non è stato toccato spesso per paura di rompere la compatibilità con le versioni precedenti (My opinion and guess) – PeterE

+0

'setup.cfg' è un file di cui l'utente ha il controllo completo. Non dovresti distribuirlo con il tuo codice. –

0

Come osservazione: su Linux, è possibile utilizzare molte delle variabili di ambiente autoconf. Per il compilatore

CC=mpicc python setup.py build_ext -i