python - traducidos - qué son los lenguajes compilados y los lenguajes interpretados
Distutils de Python, ¿cómo obtener un compilador que se va a utilizar? (6)
Esta es una versión ampliada de la respuesta de Luper Rouch que me funcionó para obtener una extensión de openmp para compilar usando mingw y msvc en Windows. Después de subclasificar build_ext, debe pasarlo a setup.py en el cmdclass arg. Al hacer una subclase de build_extensions en lugar de finalize_options, tendrá que examinar el objeto del compilador real para poder obtener información más detallada sobre la versión. Eventualmente, podría establecer marcas de compilación por compilador, por extensión:
from distutils.core import setup, Extension
from distutils.command.build_ext import build_ext
copt = {''msvc'': [''/openmp'', ''/Ox'', ''/fp:fast'',''/favor:INTEL64'',''/Og''] ,
''mingw32'' : [''-fopenmp'',''-O3'',''-ffast-math'',''-march=native''] }
lopt = {''mingw32'' : [''-fopenmp''] }
class build_ext_subclass( build_ext ):
def build_extensions(self):
c = self.compiler.compiler_type
if copt.has_key(c):
for e in self.extensions:
e.extra_compile_args = copt[ c ]
if lopt.has_key(c):
for e in self.extensions:
e.extra_link_args = lopt[ c ]
build_ext.build_extensions(self)
mod = Extension(''_wripaca'',
sources=[''../wripaca_wrap.c'',
''../../src/wripaca.c''],
include_dirs=[''../../include'']
)
setup (name = ''wripaca'',
ext_modules = [mod],
py_modules = ["wripaca"],
cmdclass = {''build_ext'': build_ext_subclass } )
Por ejemplo, puedo usar python setup.py build --compiler=msvc
o python setup.py build --compiler=mingw32
o simplemente python setup.py build
, en cuyo caso se python setup.py build
el compilador predeterminado (por ejemplo, bcpp
). ¿Cómo puedo obtener el nombre del compilador dentro de mi setup.py (por ejemplo, mingw32
, mingw32
y bcpp
, respectivamente)?
UPD .: No necesito el compilador predeterminado, necesito el que realmente se va a usar, que no es necesariamente el predeterminado. Hasta ahora no he encontrado una forma mejor que analizar sys.argv
para ver si hay una cadena de --compiler...
allí.
Puede subclasificar el comando distutils.command.build_ext.build_ext
.
Una vez que se ha llamado al método build_ext.finalize_options()
, el tipo de compilador se almacena en self.compiler.compiler_type
como una cadena (la misma que la que se pasa a la opción --compiler
, por ejemplo, ''mingw32'', ''gcc'' , etc ...).
import distutils.ccompiler
compiler_name = distutils.ccompiler.get_default_compiler ()
#This should work pretty good def compilerName(): import re import distutils.ccompiler comp = distutils.ccompiler.get_default_compiler() getnext = False for a in sys.argv[2:]: if getnext: comp = a getnext = False continue #separated by space if a == ''--compiler'' or re.search(''^-[a-z]*c$'', a): getnext = True continue #without space m = re.search(''^--compiler=(.+)'', a) if m == None: m = re.search(''^-[a-z]*c(.+)'', a) if m: comp = m.group(1) return comp print "Using compiler " + ''"'' + compilerName() + ''"''
class BuildWithDLLs(build):
# On Windows, we install the git2.dll too.
def _get_dlls(self):
# return a list of of (FQ-in-name, relative-out-name) tuples.
ret = []
bld_ext = self.distribution.get_command_obj(''build_ext'')
compiler_type = bld_ext.compiler.compiler_type
Puede usar self.distribution.get_command_obj (''build_ext'') para obtener la instancia build_ext, y luego obtener el compiler_type
import sys
sys.argv.extend([''--compiler'', ''msvc''])