2011-07-09 11 views
16

¿Cómo especifico los archivos de encabezado en una secuencia de comandos setup.py para un módulo de extensión de Python? Enumerarlos con los archivos de origen de la siguiente manera no funciona. Pero no puedo averiguar dónde más ponerlos en una lista.¿Cómo se especifican los archivos de cabecera en la secuencia de comandos setup.py para el módulo de extensión de Python?

from distutils.core import setup, Extension 
from glob import glob 

setup(
    name = "Foo", 
    version = "0.1.0", 
    ext_modules = [Extension('Foo', glob('Foo/*.cpp') + glob('Foo/*.h'))] 
) 
+0

intentar importar setuptools en lugar de distutils.core. Entonces creo que recogerá los archivos de encabezado automáticamente. Si eso no funciona, agregue MANIFEST.in como a continuación –

Respuesta

13

Añadir MANIFEST.in archivo además de la configuración. py con los siguientes contenidos:

graft relative/path/to/directory/of/your/headers/ 
+0

¿No le dice esto a distutils que instale el No quiero instalar los encabezados, solo deben usarse como entrada para el compilador. Solo se debe instalar el archivo pyd producido por el compilador. – user763305

+2

No, el suero no se instalará. MANIFEST no es para instalación , pero para distribución de fuente (setup.py sdist). –

+2

¡Genial! Pero me sorprende que necesites un MANIFIESTO para hacer algo así de simple. – user763305

3

Si mal no recuerdo, solo debería especificar los archivos fuente y se supone que debe encontrar/usar los encabezados.

En el manual de herramientas de configuración, veo algo de esto, creo.

"Por ejemplo, si su extensión requiere archivos de cabecera en el directorio de incluir en la raíz de su distribución, utilice la opción include_dirs"

Extension('foo', ['foo.c'], include_dirs=['include']) 

http://docs.python.org/distutils/setupscript.html#preprocessor-options

+1

Lo intenté. No encontró los encabezados. – user763305

+0

Edité mi pregunta, mira si funciona. :) –

+0

Intentó ext_modules = [Extensión ('Foo', glob ('Foo/*. Cpp'), include_dirs = ['Foo'])]. No funciona; los archivos de encabezado no se agregan al paquete. – user763305

3

Pruebe los encabezados kwarg para la instalación(). No sé si está documentado en cualquier lugar, pero funciona.

setup(name='mypkg', ..., headers=['src/includes/header.h']) 
+0

Eso debería funcionar. No tengo idea de si el documento fue omitido por la supervisión o si se suponía que era un detalle interno. –

+3

@ Éric Araujo: Lo intenté y no funcionó. Hice "setup.py sdist", y los encabezados no fueron incluidos en Foo-0.1.0.zip. – user763305

+3

En realidad, hay una nota en el código del comando sdist que dice que los encabezados no están incluidos, y otra nota en build_ext (que define una función get_source_file utilizada por sdist para compilar una parte de su lista de archivos) que dice "No sería bueno si supiéramos los nombres de los archivos de encabezado también ". distutils está cerrado a las nuevas características (ahora trabajamos en distutils2), pero me inclino a considerar esto un error y arreglarlo para las próximas versiones de Python 2.7 y 3.2. Abriré un informe sobre bugs.python.org más adelante. –

5

He tenido tantos problemas con setuptools que ya no es divertido. Así es como terminé teniendo que usar una solución alternativa para producir una distribución de fuente de trabajo con archivos de encabezado: utilicé package_data.

Lo estoy compartiendo con el fin de salvar potencialmente a alguien más el agravante. Si conoce una solución de trabajo mejor, hágamelo saber.

Ver aquí para más detalles: https://bitbucket.org/blais/beancount/src/ccb3721a7811a042661814a6778cca1c42433d64/setup.py?fileviewer=file-view-default#setup.py-36

# A note about setuptools: It's profoundly BROKEN. 
    # 
    # - The header files are needed in order to distribution a working 
    # source distribution. 
    # - Listing the header files under the extension "sources" fails to 
    # build; distutils cannot make out the file type. 
    # - Listing them as "headers" makes them ignored; extra options to 
    # Extension() appear to be ignored silently. 
    # - Listing them under setup()'s "headers" makes it recognize them, but 
    # they do not get included. 
    # - Listing them with "include_dirs" of the Extension fails as well. 
    # 
    # The only way I managed to get this working is by working around and 
    # including them as "packaged data" (see {63fc8d84d30a} below). That 
    # includes the header files in the sdist, and a source distribution can 
    # be installed using pip3 (and be built locally). However, the header 
    # files end up being installed next to the pure Python files in the 
    # output. This is the sorry situation we're living in, but it works. 

Hay un ticket correspondiente en mi proyecto OSS: https://bitbucket.org/blais/beancount/issues/72

Cuestiones relacionadas