2011-11-06 19 views
37

मैंने "सी अवधारणा के प्रमाण" के रूप में साइथन का उपयोग करके विस्तार के रूप में अपनी सी लाइब्रेरी का हिस्सा संकलित किया है। अंत में एक विस्तार प्राप्त करने के लिए, मैं कोड (कॉन्स सही समस्याएं इत्यादि) को हैक करने में कामयाब रहा।साइथन संकलित सी एक्सटेंशन: आयात त्रुटि: गतिशील मॉड्यूल init फ़ंक्शन को परिभाषित नहीं करता

हालांकि, जब मैं नव निर्मित एक्सटेंशन आयात करने का प्रयास किया, मैं निम्नलिखित त्रुटि मिली:

ImportError: dynamic module does not define init function 

क्या मैं गलत कर रहा हूँ और मैं इसे ठीक कर सकता हूँ?

मैं Ubuntu पर Cythn 0.11.2 और अजगर 2.6.5 का उपयोग कर रहा 10.0.4

+1

क्या कमांड लाइन आप के लिए उपयोग किया था ग जेनरेट करती हैं? आपने इसे कैसे संकलित किया? – tito

+0

मुझे अभी तक एक संकलन त्रुटि के संबंध में [साइथन प्रश्न] (http://stackoverflow.com/questions/41926482/cython-compileerror-when-attempting-to-compile-extension-type) पर प्रतिक्रिया प्राप्त नहीं हुई है। आप मदद करने में सक्षम हो सकते हैं। – Phillip

उत्तर

56

मैं पाया है कि इस समस्या का एक कारण अक्सर, जब एक distutils सेटअप फ़ाइल का उपयोग कर कोड को संकलित करने, कि .pyx आधार नाम एक्सटेंशन नाम, जैसे मेल नहीं खाती:

ext = Extension(name='different', sources=['cython_ext.pyx']) # Won't work 

समस्या से बचने के लिए एक्सटेंशन नाम बिल्कुल वही होना चाहिए, इस मामले में, cython_ext

+0

अच्छा कॉल। क्या कोई जानता है कि यह क्यों काम करता है, और क्यों एक अलग नाम नहीं है? – dinkelk

+0

मुझे अभी तक एक संकलन त्रुटि के संबंध में [साइथन प्रश्न] (http://stackoverflow.com/questions/41926482/cython-compileerror-when-attempting-to-compile-extension-type) पर प्रतिक्रिया प्राप्त नहीं हुई है। आप मदद करने में सक्षम हो सकते हैं। – Phillip

+0

@ डॉल्गान, मुझे एक दिन बचाने के लिए बहुत बहुत धन्यवाद! – q0987

3

यह एक बहुत ही देर से जवाब है - लेकिन मैं सिर्फ एक ही त्रुटि थी, और मेरा दूर चला गया जब मैं __cinit__ के बजाय इस्तेमाल किया __init__। मैं अभी भी एक्सटेंशन प्रकारों के बारे में सोच रहा हूं इसलिए वर्तमान में मुझे नहीं पता कि ऐसा क्यों होता है। :) (आप http://docs.cython.org/src/reference/extension_types.html#initialization-cinit-and-init पर एक नज़र डाल सकते हैं) उम्मीद है कि यह किसी के लिए उपयोगी है।

+0

मुझे अभी तक एक संकलन त्रुटि के संबंध में एक [साइथन प्रश्न] (http://stackoverflow.com/questions/41926482/cython-compileerror-when-attempting-to-compile-extension-type) पर प्रतिक्रिया प्राप्त नहीं हुई है। आप मदद करने में सक्षम हो सकते हैं। – Phillip

16

ऐसा लगता है कि यह साइथन में एक बग/सुविधा है। मेरी .pyx फ़ाइल के शीर्ष पर

STUFF = "Hi" 

और इस मुद्दे को दूर चला गया: मैं एक ही बात की थी, लेकिन बस गयी। ऐसा लगता है कि कोई वैश्विक प्रारंभिकता नहीं है (cinit या वैश्विक चर सेट करना), कि आवश्यक प्रारंभिक कोड उत्पन्न नहीं होता है।

+3

वाह। मैं विश्वास नहीं कर सकता कि वास्तव में काम किया है, लेकिन यह मेरी पुस्तकालय में एक ही बग तय किया। – Rick

+0

यह मेरे लिए भी काम किया .. मेरे अविश्वास के लिए। – coffeepls

0

इसी प्रकार देर से उत्तर ... लेकिन मैं विशेष रूप से इस प्रश्न पर अपना रास्ता ढूंढ रहा था। यह संभवतः मेल खाने वाले नामों से संबंधित है जो डॉलोगन पते हैं।

मेरे मामले में क्या हुआ था कि मैं एक उदाहरण का अनुकूलन कर रहा था जिसे मैं काम करने के लिए मिला, और module does not define init function त्रुटि मिली। यह (जैसे)

nm -m build/lib.macosx-10.9-x86_64-2.7/myproj.so

का उपयोग कर इस आदेश के उत्पादन में से सत्यापित किया गया था मैं 'init' के लिए खोज की और पाया

000000000000c0d0 (__TEXT,__text) external _initexample

मैं अपने setup.py और .pyx फ़ाइल से 'उदाहरण' के सभी उदाहरणों हटा दिया था , लेकिन यह site-packages से एक्सटेंशन को हटाने के बाद भी जारी रहा, बिल्ड और डिस्ट फ़ोल्डरों को हटा रहा था, आदि। अंततः मुझे पता चला कि मेरी .pyx फ़ाइल से उत्पन्न .cpp फ़ाइल अभी भी उदाहरण में कक्षा के नाम का जिक्र कर रही है। एक बार जब मैं अपने setup.py, आयात काम करता है reran, और वास्तव में .so फ़ाइल

000000000000c0a0 (__TEXT,__text) external _initmyproj

0

मैं वर्तमान में ओ रेली किताब के साथ Cython सीख रहा हूँ शामिल है, और एक ही समस्या का सामना करना पड़ा। मेरे लिए समस्या का हल क्या हुआ कार्य में एक डॉकस्ट्रिंग जोड़ रहा था।

यह काम नहीं किया:

def fib(int n): 
    cdef int i 
    cdef double a=0.0, b=1.0 
    for i in range(n): 
     a, b = a + b, a 
    return a 

यह काम किया:

def fib(int n): 
    '''Returns the nth Fibonacci number.''' 
    cdef int i 
    cdef double a=0.0, b=1.0 
    for i in range(n): 
     a, b = a + b, a 
    return a