Building Python Package Containing Multiple Cython Extensions
Solution 1:
I resolved this issue, with the help of a colleague, so I'll mention the solution here in case it helps people in the future.
The problem is related to how the Cython modules are imported, and more specifically - where the .so file is placed upon building the extension. Originally, the Bar.so file was generated in the testcython directory - such that when attempting import from the bar sub-module, it couldn't find the corresponding shared object file.
To solve this I needed to use the name "bar.bar" when creating this extension, this then results in the .so file being generated into the testcython/bar directory. Then, in foo.pyx, to use members from this bar module the import had to be changed to from testcython.bar.bar cimport <name>.
Note:
Additionally, the function square shown in the question cannot be used from another Cython module in this form as no __pyx_capi__ is generated for free cdef functions. Instead, this function has to be wrapped in some cdef class as a static method in order to use it from another Cython module, i.e.:
cdef classSquare:
@staticmethod
cdef intsquare(int x)Then this can be imported, in foo.pyx for example, with from testcython.bar.bar cimport Square. The class Square then essentially acts like a "namespace".
Post a Comment for "Building Python Package Containing Multiple Cython Extensions"