2016-05-20 4 views
6

मैं साइथन के लिए काफी नया हूं लेकिन मैं और जानने की कोशिश कर रहा हूं, क्योंकि मैं काफी बड़े और जटिल सेट को कॉल करने में सक्षम होना चाहता हूं सीधे पायथन से सी/सी ++ कोड।साइथन के लिए नया ... उचित रूप से रैम enum को प्रतीत नहीं कर सकता

मैं उदाहरणों के माध्यम से ठीक से चलाने में सक्षम हूं और मुख्य परियोजना का एक बहुत छोटा हिस्सा लपेटने में भी सक्षम हूं जिस पर मैं काम कर रहा हूं। लेकिन मैं रैपिंग enums पर फंस गया है।

मैंने एक बहुत ही सरल उदाहरण में जो कोशिश कर रहा हूं उसे तोड़ने की कोशिश की है।

यहाँ सी कोड, myenum.h में यहाँ है

// myenum.h 
enum strategy { 
    slow = 0, 
    medium = 1, 
    fast = 2 
}; 

यहाँ है कि मैं क्या pymyenum.pyx

# distutils: language = c 
cdef extern from "myenum.h" namespace "myenum": 
    cdef enum strategy: 
     slow, 
     medium, 
     fast 

में एक wapper के रूप में काम करेगा सोचा है और मेरे setup.py

है
from distutils.core import setup 
from Cython.Build import cythonize 

setup(ext_modules = cythonize(
    "pymyenum.pyx",     # our Cython source 
    sources=["myenum.h"], # additional source file(s) 
    language="c",    # generate C code 
    )) 

इस निर्देशिका में, मैं

चलाने 0
python setup.py build_ext --inplace 

और मुझे अपना pymyenum.so मिलता है, कि मैं आयात कर सकता हूं! हाँ! लेकिन मैं रणनीति तक नहीं पहुंच सकता।

In [1]: import pymyenum 

In [2]: pymyenum. 
pymyenum.c pymyenum.pyx pymyenum.so 

In [2]: pymyenum.strategy 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-2-80980071607b> in <module>() 
----> 1 pymyenum.strategy 

AttributeError: 'module' object has no attribute 'strategy' 

In [3]: from pymyenum import strategy 
--------------------------------------------------------------------------- 
ImportError        Traceback (most recent call last) 
<ipython-input-3-9bae6637f005> in <module>() 
----> 1 from pymyenum import strategy 

ImportError: cannot import name strategy 

मुझे इस से बाहर निकलने के लिए सही उदाहरण नहीं मिल रहा है। किसी भी व्यक्ति के लिए अग्रिम धन्यवाद जो मदद कर सकता है!

मैट

उत्तर

6

यह अगर आप इस pymyenum.pyx का उपयोग जैसे आप चाहें काम करेगा:

# distutils: language = c 
cdef extern from "myenum.h": 
    cpdef enum strategy: 
     slow, 
     medium, 
     fast 

ध्यान रखें कि आपके हैडर नहीं 'myenum' नाम स्थान के साथ एसी हैडर है, और यह भी चीज के लिए cpdef है आप पाइथन को निर्यात करना चाहते हैं। cdef सिर्फ चीथन कोड में उपलब्ध चीजें बनाता है।

+0

यह काम किया! धन्यवाद! –

+0

और मुझे 'cdef' और' cpdef' के बीच अंतर को समझाने के लिए समय निकालने के लिए धन्यवाद। शिक्षा की बहुत सराहना करते हैं। –

+2

@MattBellis यदि यह आपके प्रश्न का उत्तर देता है तो उसे टिक पर क्लिक करके स्वीकार किए गए उत्तर के रूप में चिह्नित करना सुनिश्चित करें :-) –

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