2016-05-20 9 views
6

Yararlı bir şekilde sarmak mümkün görünmüyor, ancak oldukça geniş ve karmaşık bir dizi C/C++ kodu doğrudan Python'dan.Cython'da Yeni ...

Örnekler arasında geçiş yapabildim ve üzerinde çalıştığım ana projenin çok küçük bir bölümünü bile tamamlayabiliyorum. Ama envanterlere sarıldım.

Çok basitleştirilmiş bir örnekte denediğimi anlamaya çalıştım. İşte

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

Ben pymyenum.pyx

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

bir wapper olarak çalışmak düşündüm ne myenum.h içinde, C kodu Ve burada benim setup.py

olduğunu Bu dizinde
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 
    )) 

, ben

çalıştırmak

ve pymyenum.so'yu alabilirim, alabilirim! Evet! Fakat stratejiye erişemiyorum.

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 

Bundan kurtulmak için doğru örneği bulamıyorum. Yardım edebilecek herkes için şimdiden teşekkürler!

Matt

cevap

6

araçlarının bu pymyenum.pyx kullanırsanız istediğiniz nasıl çalışır:

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

Not senin başlık hayır 'MyEnum' ad ile ac başlığı olduğunu ve herhangi bir şey için cpdef var sen python'a ihraç edilmesini ister. cdef, sadece bir şeyleri cython kodunda kullanılabilir hale getirir.

+0

Bu işe yaradı! Teşekkürler! –

+0

Ve cdef' ve cpdef' arasındaki farkı bana açıklamak için zaman ayırdığınız için teşekkürler. Eğitimi çok takdir ediyorum. –

+2

@MattBellis, bu soruları yanıtlarsa, onaylanmış yanıt olarak işaretle işaretine tıkladığınızdan emin olun :-) –