2010-11-23 18 views
7

J'ai un répertoire qui ressemble à ceci:Extensions de script d'installation Python, comment incluez-vous un fichier .h?

home\ 
    setup.py 
    some_python_file.py 
    ext\ 
     __init__.py 
     c_file1.c 
     c_file2.c 
     ext_header.h 

Il est évident que le fichier d'en-tête est nécessaire pour compiler les fichiers c, mais le problème est que je ne peux pas obtenir le script d'installation pour inclure la En tête de fichier.

Mon objet d'extension est quelque chose comme ceci:

Extension('ext.the_extension', ['ext/c_file1.c', 'ext/c_file2.c']) 

Ce qui fonctionne, mais ne comprend pas le fichier d'en-tête. Si je change à:

Extension('ext.the_extension', ['ext/c_file1.c', 'ext/c_file2.c', 'ext_header.h']) 

Il comprend le fichier « .h » mais ne construit pas quand je lance l'installation. Au contraire, il donne et erreur error: unknown file type '.h' (from 'ext/ext_header.h')

Si je le fichier d'en-tête sous forme de fichier de données comme ceci:

data_files=[('ext', ['ext/ext_header.h'])] 

il ne fonctionne pas du tout, le fichier .h ne fait même pas dans la Fichier MANIFEST.

Donc, ma question est, comment incluez-vous cette extension avec le fichier d'en-tête de sorte que python setup.py install va le construire correctement?

Répondre

6

J'ai l'impression que pyfunc est sur la bonne voie pour une solution plus standard, mais j'ai trouvé une autre solution par moi-même. Je n'ai aucune idée si c'est une bonne solution ou juste un hack, mais tout ce que j'ai fait est d'ajouter le fichier d'en-tête à la MANIFEST.in. La documentation ne donne pas vraiment l'impression que c'est ce à quoi sert le fichier MANIFEST.in, mais cela fonctionne. Mon fichier MANIFEST.in ressemble maintenant à ceci:

include ext/ext_header.h 

Ce qui inclut le fichier et compile avec succès quand je lance python setup.py install

+0

si vous avez plusieurs fichiers d'en-tête « comprennent ext/*. H » aurait fonctionné aussi bien. Veuillez marquer ceci (oui votre propre réponse) comme la solution. – Anthon

1

De la documentation,

module1 = Extension('demo', 
       define_macros = [('MAJOR_VERSION', '1'), 
           ('MINOR_VERSION', '0')], 
       include_dirs = ['/usr/local/include'], 
       libraries = ['tcl83'], 
       library_dirs = ['/usr/local/lib'], 
       sources = ['demo.c']) 

Vous devez fournir les inclure des fichiers via "include_dirs".

Pourquoi cela ne fonctionne-t-il pas pour vous?

+0

Je pense que cela pourrait être le bon chemin, mais je suis un peu confus quant à ce qui est passe. La variable include_dir ne dit-elle pas au compilateur où chercher les fichiers d'en-tête? Comment cela aboutirait-il à ce que mon fichier .h fasse partie du MANIFEST? – user411133

+0

'inclure dirs' indique au compilateur où chercher les fichiers d'en-tête standard, vous joindre à' <> ', par exemple' ',' ', etc. Dans le cas où le script d'installation ne veut pas emballer votre propre tête fichiers, je pense que vous n'êtes pas censé avoir des fichiers d'en-tête personnalisés dans une extension Python. –

+0

@Blagovest Buyukliev: deux têtes standard et fichiers personnalisés sont pointés dans un endroit - include \ _dirs – pyfunc