2

!Everything works with language_level=2, but does not with language_level=3

I have to wrap c-library with Cython and I also want to copy the structure of the library for better understanding. So I'd like to create separate folder with pxd files.

The project structure is following:

enter image description here

setup.py:

from setuptools import setup, Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext
from pathlib import Path

setup_file_directory = Path(__file__).resolve().parent
NAME = 'example'
SRC_DIR = "lib"
PACKAGES = [SRC_DIR]

ext = Extension(name=SRC_DIR + ".wrapper.some_code",
                sources=[SRC_DIR + "/wrapper/some_code.pyx"]
                )

EXTENSIONS = [ext]

if __name__ == "__main__":
    setup(
        packages=PACKAGES,
        zip_safe=False,
        name=NAME,
        cmdclass={"build_ext": build_ext},
        ext_modules=cythonize(EXTENSIONS, language_level=3),
    )

some_code.pyx:

from pxd_include.inc_file cimport *

cdef custom_int return_int(custom_int input_int):
    print(input_int)

inc_file.pxd:

ctypedef int custom_int

with language_level=2 in setup.py everything works and compiles. If I switch it to 3 I get an Error:

enter image description here

It is caused by unability to import pxd file with language_level=3. How to fix that?

Ivan Mishalkin
  • 1,049
  • 9
  • 25

1 Answers1

2

To make relative path work with language_level=3 I had to import pxd in somecode.pyx in this way:

from .pxd_include.inc_file cimport *

or

from lib.wrapper.pxd_include.inc_file cimport *

Last notation is compatible with language_level=2

Ivan Mishalkin
  • 1,049
  • 9
  • 25
  • 2
    Python3 uses absolute imports, whereas Python2 uses implicit relative import (see https://stackoverflow.com/q/12172791/5769463) – ead May 14 '19 at 11:15