2010-11-23 1 views
7

Also habe ich ein Verzeichnis bekam, die etwa wie folgt aussieht:Python-Setup-Skript-Erweiterungen, wie fügen Sie eine .h-Datei ein?

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

Offensichtlich ist die Header-Datei ist notwendig, um die c-Dateien zu kompilieren, aber das Problem ist, dass ich nicht das Setup-Skript enthalten bekommen kann die Header-Datei.

Mein Erweiterungsobjekt ist so etwas wie dieses:

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

Welche funktioniert, aber nicht die Header-Datei enthalten. Wenn ich es ändere:

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

Es enthält die '.h' Datei, aber dann nicht erstellt, wenn ich installiere. Stattdessen gibt es und Fehler error: unknown file type '.h' (from 'ext/ext_header.h')

Wenn ich die Header-Datei als Datendatei wie folgt umfassen:

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

es überhaupt nicht funktioniert, wird die h-Datei nicht einmal in die machen MANIFEST-Datei.

Also meine Frage ist, wie fügen Sie diese Erweiterung mit der Header-Datei, so dass python setup.py install wird es richtig bauen?

Antwort

6

Ich habe das Gefühl, dass pyfunc auf dem Weg zu einer Standardlösung ist, aber ich habe eine andere Lösung gefunden. Ich habe keine Ahnung, ob das eine gute Lösung oder nur ein Hack ist, aber alles, was ich getan habe, ist das Hinzufügen der Header-Datei zum MANIFEST.in. Die Dokumentation macht nicht wirklich den Eindruck, dass die Datei MANIFEST.in dafür gedacht ist, aber es funktioniert. Meine MANIFEST.in Datei sieht nun wie folgt aus:

include ext/ext_header.h 

, die die Datei enthält und erfolgreich kompiliert, wenn ich laufen python setup.py install

+0

Wenn Sie mehr Header-Dateien haben 'include ext/*. H' hätte auch funktioniert. Bitte markieren Sie diese (ja Ihre eigene Antwort) als Lösung. – Anthon

1

Aus den Dokumenten,

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']) 

sollten Sie die Include-Dateien bieten über "include_dirs".

Warum funktioniert das nicht für Sie?

+0

Ich denke, dies ist der richtige Weg sein könnte, aber ich bin ein wenig verwirrt, was ist geht weiter. Erteilt die Variable include_dir dem Compiler nicht nur, wo nach Header-Dateien gesucht werden soll? Wie würde dies dazu führen, dass meine .h-Datei in das MANIFEST aufgenommen wird? – user411133

+0

'include dirs' sagt dem Compiler, wo nach den Standard-Header-Dateien gesucht wird, die Sie mit' <> 'einschließen, zum Beispiel' ',' ', usw. Falls das Setup-Skript nicht Ihre eigene Kopfzeile verpacken will Ich denke, dass Sie keine benutzerdefinierten Headerdateien in einer Python-Erweiterung haben sollten. –

+0

@Blagovest Buyukliev: Auf Standard- und benutzerdefinierte Header-Dateien wird im Verzeichnis verwiesen - include \ _dirs – pyfunc

Verwandte Themen