2011-03-05 6 views
10

मुझे अलग-अलग पैकेजों में cdef-ed प्रकारों को संकलित करने में समस्याएं आ रही हैं और मुझे साइथन दस्तावेज़ों में कोई स्पष्टीकरण नहीं मिला।विभिन्न पैकेजों में निर्भरताओं के साथ पीईएक्स फाइलों को संकलित करना

मैं अपने अजगर src पेड़ की जड़ में यह setup.py है:

from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Distutils import build_ext 

setup(
    cmdclass = {'build_ext': build_ext}, 
    ext_modules = [ 
     Extension("flink.pytk.defs.FragIdx", 
     sources = ["flink/pytk/defs/FragIdx.pyx"]), 
     Extension("flink.pytk.fragments.STK_idx", 
     sources = ["flink/pytk/fragments/STK_idx.pyx"]) 
     ] 
) 

FragIdx है एक cdef एड प्रकार, में परिभाषित Flink/pytk/defs/FragIdx.pyx:

cdef class FragIdx: 
    cdef public FragIdx parent 
    cdef public FragIdx root 
    cdef public tuple label 
    ... 

और STK_idx FragIdx का एक विस्तार, Flink में परिभाषित किया गया है/pytk/टुकड़े/STK_idx.pyx:

from flink.pytk.defs.FragIdx import FragIdx 
cdef class STK_idx(FragIdx): 
    ... 

जब मैं उसी संकलन करने की कोशिश पोस्ट की शुरुआत में सूचीबद्ध setup.py एनजी, FragIdx सब ठीक संकलित किया गया है, लेकिन जब यह STK_idx की बात आती है मैं निम्न त्रुटि संदेश मिलता है:

flink/pytk/fragments/STK_idx.pyx:5:5: 'FragIdx' is not a type name 

कृपया ध्यान दें मेरे स्रोत पेड़ की जड़ निर्देशिका है कि $ PythonPATH में सूचीबद्ध है।

अगर कोई इस पर कोई प्रकाश डाल सकता है तो मैं वास्तव में सराहना करता हूं, बहुत बहुत धन्यवाद!

डेनियल

उत्तर

8

ओह, ठीक है, एक ऐसी ही समस्या हो रही उन लोगों के लिए, ऐसा लगता है शायद मैं इस सवाल का जवाब मिल गया लग रहा है।

मैं पाइथन को साझा लाइब्रेरी FragIdx.so में संकलित प्रतीकों को स्वचालित रूप से स्कैन करने की अपेक्षा कर रहा था, इसके बजाय ऐसा लगता है कि यह जानकारी स्पष्ट रूप से एक .pxd फ़ाइल के रूप में प्रदान की जानी चाहिए (जो साइथन चलाने के बाद सी हेडर फ़ाइल बन जाती है)।

वहाँ मूलतः प्रक्रिया में शामिल दो चरण हैं:

  1. एक परिभाषा (.pxd) सुपर क्लास के लिए फ़ाइल का निर्माण;
  2. उपclass मॉड्यूल में cimport (import के विपरीत) के माध्यम से सुपरक्लास परिभाषा का आयात।

तो, इसे और अधिक सामान्य बनाने के लिए।

मान लीजिए कि आपने मॉड्यूल pkg1.mod1 में अपने सीडीएफ-एड प्रकार A को परिभाषित किया है। फिर आप pkg2.mod2 में उप-वर्ग B टाइप करते हैं।

आपका निर्देशिका संरचना कुछ इस तरह दिखेगा:

pkg1/ 
    mod1.pyx 
    mod1.pxd 
pkg2/ 
    mod2.pyx 
    mod2.pxd 

pkg1/mod1.pxd में आप के लिए होता है, कहते हैं:

cdef class A: 
    cdef int a 
    cdef int b 

और pkg1/mod1.pyx में आप अपने वर्ग के तरीकों प्रदान करेगा। pkg2/mod2.pxd में, आप होगा:

from pkg1.mod1 cimport A #note "cimport"!! 
cdef class B(A): 
    cdef ... # your attributes here 

और फिर, pkg2/mod2.pyx में आप cimport करना होगा फिर से एक प्रतीक:

from pkg1.mod1 cimport A #note "cimport"!! 
cdef class B(A): 
    ... # your methods here 

दिलचस्प बात यह आप बस अपने अजगर में A उपयोग करना चाहते हैं कोड, उपप्रकार को परिभाषित करने के लिए इसका उपयोग करने के विरोध में, परिभाषा फ़ाइल mod1.pxd की आवश्यकता नहीं है। यह इस तथ्य से संबंधित है कि जब एक एक्सटेंशन प्रकार बनाते हैं तो आपको सी कंपाइलर के लिए उपलब्ध होने वाली परिभाषाओं की आवश्यकता होती है, जबकि आपके पास पाइथन कोड चलाने पर यह समस्या नहीं होती है, लेकिन चूंकि यह बहुत सहज नहीं है, इसलिए इसे इंगित करना महत्वपूर्ण है बाहर।

यह जानकारी वास्तव में Cython docs में उपलब्ध है, हालांकि शायद यह थोड़ा और स्पष्ट हो सकता है।

आशा है कि यह जानकारी किसी को किसी को बचा सकती है।

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

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