2013-05-31 10 views
11

Hat jemand ein gutes Beispiel dafür, den Befehl build_clib in Distutils zu verwenden, um eine externe (nicht Python) C-Bibliothek aus setup.py zu erstellen? Die Dokumentation zu diesem Thema scheint spärlich oder nicht existent zu sein.Verwenden von distutils und build_clib zum Erstellen der C-Bibliothek

Mein Ziel ist es, eine sehr einfache externe Bibliothek zu erstellen und dann einen Cython-Wrapper zu erstellen, der darauf verlinkt. Das einfachste Beispiel, das ich gefunden habe, ist here, aber das verwendet einen system() Aufruf an gcc, was ich mir nicht vorstellen kann, ist Best Practice.

+1

„Wie Dritt C bauen/C++ - Bibliothek von setup.py? " Dies ist eine wichtige Frage und ein häufiger Anwendungsfall (wenn Sie Python-Bindungen für eine C-Bibliothek schreiben, muss setup.py die Bibliothek aus der Quelle erstellen, bevor sie Ihre Python-Erweiterung erstellen kann). Ich wünsche, dass die Dokumentation das besser (überhaupt!) Behandelt –

+2

Danke für das Teilen, ich hätte das nie anders herausgefunden. Habe meins zur Arbeit an https://github.com/hickford/primesieve-python/blob/master/setup.py –

Antwort

10

Statt einen Bibliotheksnamen als String zugeben, ein Tupel mit den Quellen passieren zu kompilieren:

setup.py

import sys 
from distutils.core import setup 
from distutils.command.build_clib import build_clib 
from distutils.extension import Extension 
from Cython.Distutils import build_ext 

libhello = ('hello', {'sources': ['hello.c']}) 

ext_modules=[ 
    Extension("demo", ["demo.pyx"]) 
] 

def main(): 
    setup(
     name = 'demo', 
     libraries = [libhello], 
     cmdclass = {'build_clib': build_clib, 'build_ext': build_ext}, 
     ext_modules = ext_modules 
    ) 

if __name__ == '__main__': 
    main() 

hello.c

int hello(void) { return 42; } 

hello.h

int hello(void); 

demo.pyx

cimport demo 
cpdef test(): 
    return hello() 

demo.pxd

cdef extern from "hello.h": 
    int hello() 

Kodex als Kern verfügbar: https://gist.github.com/snorfalorpagus/2346f9a7074b432df959

+0

Hallo. Ich habe versucht, das zu tun, aber anscheinend das Argument "Bibliotheken" erwartet nur eine Liste der Zeichenfolge mit Bibliotheksnamen. Ist das korrekt? ... – dividebyzero

+0

Das Argument Bibliotheken sollte eine Liste von 2-Tupeln sein, deren erstes Element eine Namenszeichenfolge für die Bibliothek und das zweite Element ein Wörterverzeichnis für Parameter ist. Sehen Sie sich die Funktion build_libraries() an: http://svn.python.org/projects/python/branches/pep-0384/Lib/distutils/command/build_clib.py – Snorfalorpagus

Verwandte Themen