2013-05-31 16 views
11

Herhangi biri, setup.py'den harici (non-python) C kütüphanesi oluşturmak için build_clib komutunu kullanarak iyi bir örnek var mı? Konuyla ilgili belgelerin seyrek veya yokmuş gibi görünüyor.C kütüphanesi oluşturmak için distutils ve build_clib kullanma

Amacım çok basit bir dış kitaplık oluşturmak, daha sonra ona bağlanan bir steli sarmalayıcı oluşturmak. Bulduğum en basit örnek here, ancak bu en iyi uygulama olduğunu hayal edemediğim bir system() gcc çağırır.

+1

"Nasıl üçüncü taraf C inşa etmek/C++ kütüphanesi, setup.py? " Bu önemli bir soru ve ortak kullanım vakasıdır (eğer bir C kütüphanesi için Python bağlamaları yazıyorsanız, o zaman setup.py kütüphaneyi Python uzantınızı oluşturabilmeden önce kaynaktan oluşturmalıdır). Keşke bu belgeleri daha iyi ele alsaydım (hiç!) –

+2

Paylaştığın için teşekkürler, bunu başka türlü anlamadım. Benim çalışmam https://github.com/hickford/primesieve-python/blob/master/setup.py –

cevap

10

yerine bir dize olarak bir kitaplık adı geçen, derlemek kaynaklarıyla bir demet:

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() 

merhaba.c

int hello(void) { return 42; } 

hello.h

int hello(void); 

demo.pyx

cimport demo 
cpdef test(): 
    return hello() 

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

Kod bir ana fikri olarak kullanılabilir demo.pxd: https://gist.github.com/snorfalorpagus/2346f9a7074b432df959

+0

Merhaba. Bunu yapmaya çalışıyordum, ama görünüşe göre "kütüphaneler" argümanı sadece kütüphane isimleri olan bir dize listesi bekliyor. Bu doğru mu? ... – dividebyzero

+0

Kütüphaneler argümanı, ilk elemanın kütüphane için bir isim dizesi ve ikincisi parametrelerin bir sözlüğü olduğu 2-tupllerin bir listesi olmalıdır. Http://svn.python.org/projects/python/branches/pep-0384/Lib/distutils/command/build_clib.py adresindeki build_libraries() işlevini görün. – Snorfalorpagus

İlgili konular