I have a simple project directory and some simple files which failed to compile.
Directory structure:
cythonize: ROOT
|___ cythonize
|___ __init__.pxd
|___ __init__.py
|___ first.pxd
|___ first.pyx
|___ second.pxd
|___ second.pyx
|___ README.md
|___ setup.py
Let me show what are the exact content in every file.
__init__.pxd:
<EMPTY FILE>
__init__.py:
<EMPTY FILE>
first.pxd:
cdef class MyClass:
cdef str good
cdef str bad
cdef str say(self, str x, str y)
first.pyx:
cdef class MyClass:
cdef str say(self, str x, str y):
return x
second.pxd:
from . cimport first # removing this does not help
second.pyx:
#cython language_level=3
from . cimport first
cdef first second(str a, str b):
return first(a, b)
Objective
I am simply trying to cimport first from first.pxd into second.pyx in order to use first in second.pyx.
Compilation Errors
>>> cythonize -i -k -3 cythonize/second.pyx
Compiling C:\...\cythonize\cythonize\second.pyx because it changed.
[1/1] Cythonizing C:\...\cythonize\cythonize\second.pyx
Error compiling Cython file:
------------------------------------------------------------
...
#cython language_level=3
from . cimport first
cdef first second(str a, str b):
^
------------------------------------------------------------
cythonize\second.pyx:5:5: 'first' is not a type identifier
Error compiling Cython file:
------------------------------------------------------------
...
#cython language_level=3
from . cimport first
cdef first second(str a, str b):
return first(a, b) ^
------------------------------------------------------------
cythonize\second.pyx:6:11: 'first' is not a constant, variable or function identifier
Failed compilations: cythonize.second
Maybe one can show what is the minimum viable example that can make this work?
This error message:
cythonize\second.pyx:5:5: 'first' is not a type identifierTells you that 'first' is not the name of an object type. It is the name of the file. You are importing the file and its objects, but you cannot build an object of the entire file.
For example, you could do
cdef first.MyClass1as a type.