2015-10-25 11 views
19

Gibt es eine Möglichkeit, den Compiler explizit zum Erstellen von Cython-Erweiterungen zu zwingen, wenn python setup.py install ausgeführt wird? Verwendung von Anaconda 3.16, Python 3.4, SetuptoolsCompiler erzwingen, wenn Python ausgeführt wird 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()] 
) 

Ich versuche, ein Paket auf Windows 8.1 x64 zu installieren, 18, Numpy 1,9 und Cython 0,24: Wo setup.py ist von der Form. Das Bereitstellungsskript wurde aus der Cython und this Stack Overflow-Antwort angepasst.

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 

Das Problem ist, dass in diesem Fall setup.py install noch den mingw Compiler mit Conda anstelle des MS Windows SDK 7.1 eines enthalten verwendet.

  • So ist die DISTUTILS_USE_SDK=1 und MSSdk=1 scheinen keinen Einfluss auf die buid zu haben. Ich bin mir nicht sicher, ob das Aktivieren des MS SDK aus einem conda virtualenv hier ein Problem sein könnte.

  • Running python setup.py build_ext --compiler=msvc erstellt korrekt die Erweiterung mit dem MS-Compiler, aber anschließend setup.py install läuft, kompiliert es erneut mit Mingw. Gleiches gilt für python setup.py build --compiler=msvc.

  • Auch versucht, %COMSPEC% /E:ON /V:ON /K "%PROGRAMFILES%\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" ausgeführt, wie in der Antwort oben verknüpft diskutiert, aber für mich erzeugt dies eine neue Terminal-Eingabeaufforderung, gelb markiert, und stoppt den Installationsvorgang.

Gibt es eine Möglichkeit, die Compiler zwingen, dieses Paket für den Aufbau, zum Beispiel durch die setup.py Bearbeitung?

+2

Versuchen 'python setup.py build_ext --compiler = msvc --force' mit dem Compiler zu zwingen, um das Paket zu bauen/umbauen und sehen, was passiert. – romeric

+0

@romeric Also baut '' build_ext' 'die Erweiterung mit MS VC wie erwartet (sowohl mit als auch ohne das '--force' Flag). Das Problem ist, dass wenn ich dann 'install' starte, wird es mit mingw neu aufgebaut. – rth

Antwort

14

Sie können (standardmäßig) Befehlszeilenargumente für distutils in einer separaten Datei mit der Bezeichnung setup.cfg (parallel zu Ihrer setup.py) bereitstellen. Weitere Informationen finden Sie unter docs. So stellen Sie den Compiler Verwendung so etwas wie:

[build] 
compiler=msvc 

Jetzt anrufen python setup.py build entspricht python setup.py build --compiler=msvc zu nennen. (Sie können nach wie vor direkte distutils eine andere complier zu verwenden, indem Aufruf python setup.py build --compiler=someothercompiler)

Jetzt haben Sie (erfolgreich gerichtet distutils ein msvc Compiler zu verwenden. Leider gibt es keine Möglichkeit, ihm zu sagen, die msvc Compiler zu verwenden. grundsätzlich gibt es zwei Möglichkeiten:

One:. nichts tun und distutils werden versuchen vcvarsall.bat ausfindig zu machen und dass eine Umgebung zu Setup verwenden vcvarsall.bat (und der Compiler setzt sich die Umgebung bis zu) Teil von Visual Studio sind, so du musst installiert haben, damit es funktioniert.

Zwei: Installieren Sie das Windows SDK und teilen Sie distutils mit, das zu verwenden. Beachten Sie, dass der Name DISUTILS_USE_SDK eher irreführend ist (zumindest meiner Meinung nach).Es sagt NICHT, dass Distutils das SDK verwenden soll (und es ist setenv.bat), um eine Umgebung einzurichten, sondern es bedeutet, dass distutils annehmen sollte, dass die Umgebung bereits eingerichtet wurde. Deshalb müssen Sie eine Art von Makefile.bat verwenden, wie Sie im OP gezeigt haben.

Seite Hinweis: Die spezifische Version von VisualStudio oder das Windows SDK hängt von der Python-Zielversion ab.

+1

Dank Ihrer Antwort, die Angabe des Compilers in 'setup.cfg' löst das Problem unter Windows. Das Problem besteht darin, dass das einfache Hinzufügen dieser Datei auch die Installation unter Linux unterbricht, die den gcc-Compiler und nicht MS VC verwenden sollte. Natürlich ist es möglich, die 'setup.cfg' auf der Laufzeit zu erzeugen, aber ich frage mich, ob es möglich ist, die Compiler-Option durch' setup.py' zu hacken, was flexibler wäre ... – rth

+1

Nachträglich: I Stell dir vor, du könntest Dinge tun, die du dir wünschst, wir reden hier über Python. Der Zielpunkt wäre wahrscheinlich der Befehl 'build_ext', da eine modifizierte Version neu erstellt oder eine vorhandene modifiziert wird. Es ist jedoch mein Eindruck, dass das ganze distutils ziemlich komplex ist (was wahrscheinlich aus der Natur des Dinges stammt, und nicht vermeidbar war) und daher auf den ersten Blick schwer zu verstehen ist. Das MS-Compiler-Setup ist ziemlich verworren und wurde aus Angst vor der Abwärtskompatibilität nicht oft berührt (Meine Meinung und Vermutung) – PeterE

+0

'setup.cfg' ist eine Datei, die der Benutzer vollständig kontrolliert. Sie sollten es nicht mit Ihrem Code verteilen. –

0

Als Anmerkung: Unter Linux können Sie viele der Autoconf-Umgebungsvariablen verwenden. Für den Compiler

CC=mpicc python setup.py build_ext -i 
Verwandte Themen