2016-05-25 10 views
0

Ich bin neu in Cython. Ich habe eine Quellcodedatei hello.pyx:cpdef in Cython-Tutorials funktioniert nicht

cdef extern from "math.h": 
    cpdef double sin(double x) 

und meine setup.py Datei ist:

from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Build import cythonize 

ext_modules=[ 
    Extension("hello", 
       sources=["hello.pyx"], 
       libraries=["m"] # Unix-like specific 
    ) 
] 

setup(
name = "Demos", 
ext_modules = cythonize(ext_modules) 
) 

ich es dann zu einem .so zusammengestellt.

Aber, wenn ich import hello, bekomme ich nicht die hello.sin Funktion.

Also was ist der Zweck von "Hier ist ein Cython-Modul, das direkten Zugriff auf die C sin() Funktion für Python-Code bietet:" in der Anleitung geschrieben?

Ich verfolge die official tutorial auf externen Deklarationen.

Ergebnisse für die Ausführung von cythoning:

Compiling hello.pyx because it changed. 
Cythonizing hello.pyx 
running build_ext 
building 'hello' extension 
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall-Wstrict-prototypes -fPIC -I/pool/software/python/python27plus-ibm/include/python2.7 -c hello.c -o build/temp.linux-x86_64-2.7/hello.o 
gcc -pthread -shared build/temp.linux-x86_64-2.7/hello.o -L/proj/dist/sandbox/miniconda/lib -lm -lpython2.7 -o /home/shaowu/Documents/cython_play/hello.so 
+0

Also wird das Modul importiert, aber es gibt keine 'sin' Funktion? Wenn Sie versuchen, auf "hello.sin" zuzugreifen, erhalten Sie einen 'AttributError'? –

+0

@Jim Korrigieren. Wenn ich 'dir (hallo)' tue, gibt es keine "Sünde", ich weiß nicht warum ... – Shaowu

+1

Ich würde die Version überprüfen, die du verwendest. Mein Eindruck ist, dass dies vor ein paar Jahren hinzugefügt wurde, vielleicht sind Sie also veraltet. – DavidW

Antwort

1

Wie @DavidW erwähnt, ist dies höchstwahrscheinlich auf Sie eine alte Version von Cython verwenden. In Versionen < 0.22 Ihr setup.py Skript, nach Dokumentation, should look like this:

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

ext_modules=[ 
    Extension("demo", 
       ["demo.pyx"], 
       libraries=["m"]) # Unix-like specific 
] 

setup(
    name = "Demos", 
    cmdclass = {"build_ext": build_ext}, 
    ext_modules = ext_modules 
) 

Entweder verwenden Sie das, oder, im Idealfall, install the latest version.

0

ich kein Problem auf meinem Laptop haben, hier sind die Schritte, die ich tat:

  • cd in das Verzeichnis enthält hello.pyx, setup.py und test.py
  • python setup.py build_ext --inplace
  • python test.py

Das gibt:

['__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '__test__', 'sin'] 
0.479425538604203 

Mit test.py enthält:

import hello 

print(dir(hello)) 
print(hello.sin(0.5))