Obtener los comandos distutils pasa al comstackdor.

Digamos que tengo este código de Python en un script setup.py para construir una extensión C:

 from distutils.core import setup, Extension module1 = Extension('demo', sources = ['demo.c']) setup (name = 'PackageName', version = '1.0', description = 'This is a demo package', ext_modules = [module1]) 

Suficientemente fácil. Ahora llamo al script setup.py con esta línea:

 C:/> python setup.py build_ext --compiler=mingw32 

Ok, pero cual es la pregunta?

Cuando distutils llama a mingw32 y le pasa todas las opciones y banderas necesarias e independientes del sistema operativo, ¿cómo se las arregla?

¿Dónde conserva distutils los comandos relacionados con cada plataforma y cómo puedo acceder a ellos?

No es tan simple como un conjunto de opciones, pero puedes ver cómo funciona. En tu directorio de fonts de Python, busca esto.

 distutils/ccompiler.py 

En ese archivo cada comstackdor tiene una entrada como esta.

 # Map compiler types to (module_name, class_name) pairs -- ie. where to # find the code that implements an interface to this compiler. (The module # is assumed to be in the 'distutils' package.) compiler_class = { 'unix': ('unixccompiler', 'UnixCCompiler', "standard UNIX-style compiler"), 'msvc': ('msvccompiler', 'MSVCCompiler', "Microsoft Visual C++"), 'cygwin': ('cygwinccompiler', 'CygwinCCompiler', "Cygwin port of GNU C Compiler for Win32"), 'mingw32': ('cygwinccompiler', 'Mingw32CCompiler', "Mingw32 port of GNU C Compiler for Win32"), 'bcpp': ('bcppcompiler', 'BCPPCompiler', "Borland C++ Compiler"), 'emx': ('emxccompiler', 'EMXCCompiler', "EMX port of GNU C Compiler for OS/2"), } 

Puedes encontrar el código que estás buscando en

 distutils/cygwinccompiler.py 

Si editas tu script setup.py y agregas esto

 from distutils.core import setup,Extension from distutils.cygwinccompiler import Mingw32CCompiler from pprint import pprint module1 = Extension('demo', sources = ['demo.c']) m32 = Mingw32CCompiler() pprint (vars(m32)) setup (name = 'PackageName', version = '1.0', description = 'This is a demo package', ext_modules = [module1]) 

Puedes ver bastantes de las opciones disponibles …

 {'archiver': ['ar', '-cr'], 'compiler': ['gcc', '-O', '-Wall'], 'compiler_cxx': ['g++', '-O', '-Wall'], 'compiler_so': ['gcc', '-mdll', '-O', '-Wall'], 'dll_libraries': None, 'dllwrap_version': None, 'dry_run': 0, 'force': 0, 'gcc_version': LooseVersion ('4.2.1'), 'include_dirs': [], 'ld_version': None, 'libraries': [], 'library_dirs': [], 'linker_dll': 'dllwrap', 'linker_exe': ['gcc'], 'linker_so': ['dllwrap', '-mdll', '-static'], 'macros': [], 'objects': [], 'output_dir': None, 'preprocessor': None, 'ranlib': ['ranlib'], 'runtime_library_dirs': [], 'verbose': 0} 

Para acceder a las opciones individuales puede usarlas de la siguiente manera …

 print m32.compile ['gcc', '-O', '-Wall'] 

No hay un simple conjunto de banderas. Muchas de las banderas están configuradas en tiempo de ejecución y el código anterior muestra que usted debe mirar para ver cómo se generan, etc.