2013-05-31 9 views
11

क्या किसी के पास setup.py से बाहरी (गैर-पायथन) सी लाइब्रेरी बनाने के लिए build_clib कमांड में कमांड का उपयोग करने का अच्छा उदाहरण है? इस विषय पर प्रलेखन अस्पष्ट या अस्तित्वहीन प्रतीत होता है।सी लाइब्रेरी बनाने के लिए distutils और build_clib का उपयोग

मेरा उद्देश्य एक बहुत ही सरल बाहरी पुस्तकालय बनाना है, फिर एक साइथन रैपर बनाना जो उससे जुड़ा हुआ है। मुझे मिला सबसे सरल उदाहरण here है, लेकिन यह system() जीसीसी को कॉल करता है जिसे मैं कल्पना नहीं कर सकता सबसे अच्छा अभ्यास है। स्ट्रिंग के रूप लाइब्रेरी का नाम पास करने का

+1

"कैसे तीसरे पक्ष के सी के निर्माण के लिए/Setup.py से सी ++ लाइब्रेरी? " यह एक महत्वपूर्ण प्रश्न और सामान्य उपयोग केस है (यदि आप सी लाइब्रेरी के लिए पाइथन बाइंडिंग लिख रहे हैं, तो setup.py को आपके पायथन एक्सटेंशन को बनाने से पहले लाइब्रेरी को स्रोत से बनाने की आवश्यकता है)। मेरी इच्छा है कि प्रलेखन इसे बेहतर ढंग से कवर करें (बिलकुल!) –

+2

साझा करने के लिए धन्यवाद, मैंने इसे अन्यथा कभी नहीं समझा होगा। Https://github.com/hickford/primesieve-python/blob/master/setup.py –

उत्तर

10

इसके बजाय, संकलित करने के लिए स्रोतों के साथ एक टपल पारित:

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; } 

हैलो.h

int hello(void); 

demo.pyx

cimport demo 
cpdef test(): 
    return hello() 

demo.pxd

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

कोड एक सार रूप में उपलब्ध है: https://gist.github.com/snorfalorpagus/2346f9a7074b432df959

+0

हाय पर काम करने के लिए मेरा मिल गया। मैं ऐसा करने की कोशिश कर रहा था, लेकिन स्पष्ट रूप से "पुस्तकालय" तर्क केवल लाइब्रेरी नामों के साथ स्ट्रिंग की एक सूची की उम्मीद कर रहा है। क्या यह सही है? ... – dividebyzero

+0

पुस्तकालय तर्क 2-टुपल्स की एक सूची होनी चाहिए, जिसका पहला तत्व लाइब्रेरी के लिए एक नाम स्ट्रिंग है, और दूसरा पैरामीटर के शब्दकोश के रूप में है। देखें build_libraries() स्रोत को कार्य करता है: http://svn.python.org/projects/python/branches/pep-0384/Lib/distutils/command/build_clib.py – Snorfalorpagus

संबंधित मुद्दे