2017-10-13 22 views
0

zusammengestellt importieren Ich teste aus Cython auf Windows 10 (Spyder 3.2.3) und Python 3.6.3 nach dem Tutorial, und ich schrieb diese Funktion:Kann nicht cython Funktion nach erfolgreicher Kompilierung

from libc.stdlib cimport malloc, free 

cdef int** t3(int* El, int lEl): 
    cdef int lElsq = lEl*lEl 
    cdef int i,j 
    cdef int** rr = <int**> malloc(2*sizeof(int*)) 
    for i in range(2): 
     rr[i] = <int*> malloc(lElsq*sizeof(int)) 
    for i in range(lEl): 
     for j in range(lEl): 
      rr[0][i*lEl+j] = El[i] 
      rr[1][i*lEl+j] = El[j] 
    return rr 

Ich legte es in eine pyx Datei und folgte dem Tutorial kompiliert es mit dem MS Visual Studio 14 Compiler.

Befehl: %run setup.py build_ext --inplace

Setup-Datei:

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

setup(
    ext_modules=cythonize("tempCython.pyx"), 
) 

Die Zusammenstellung keine Fehler und eine Menge von Dateien werfen haben erstellt wurden:

Im selben Verzeichnis wie die Originaldatei:

  • eine tempCython.c Datei mit dem gleichen Namen
  • eine tempCython.cp36-win_amd64.pyd Datei

Im Unterverzeichnis build\temp.win-amd64-3.6\Release:

  • eine tempCython.obj Datei
  • eine tempCython.cp36-win_amd64.exp Datei
  • eine tempCython.cp36-win_amd64.lib Datei

Die 01.231.sagt mir, ich brauche die pyd Datei, also habe ich die cp36-win_amd64 im Dateinamen entfernt.

Ich kann es ohne Fehler importieren, aber meine Funktion t3 zeigt sich einfach nie, es ist einfach nicht da.

Ohne irgendeine Fehlermeldung bin ich jetzt ratlos. Ich habe Fehler wie diese zuvor manchmal in 3rd-Party-Paketen festgestellt, aber ich habe nie verstanden, was sie verursacht hat. Warum ist meine Funktion nicht da?

Ich möchte auch den Punkt all dieser zusätzlichen Dateien wissen, welche brauche ich eigentlich?

+2

http://docs.cython.org/en/latest/src/userguide/language_basics.html#python-functions-vs-c-functions – oz1

+0

Danke. Du kannst das eine Antwort geben und ich werde dir Punkte geben. – Khris

+0

Aber das ist ein Link nur Antwort ... –

Antwort

1

Sie haben eine cdef-Funktion geschrieben und versuchen, sie von Python aus aufzurufen. Leider sind cdef Funktionen von Python nicht sichtbar (siehe http://docs.cython.org/en/latest/src/userguide/language_basics.html#python-functions-vs-c-functions), also müssen Sie ein wenig mehr Arbeit tun, um Ihre Funktion gegenüber Python zu offenbaren. Insbesondere müssten Sie entweder eine def Funktion oder eine cpdef Funktion schreiben, die Ihre cdef Funktion aufruft und dann diese Funktion von python aufruft.

Verwandte Themen