How to specify Python 3 source in Cython's setup.py?

rsteward picture rsteward · Jan 5, 2016 · Viewed 26.2k times · Source

I am trying to do a "Hello World" program in Cython, following this tutorial http://docs.cython.org/src/tutorial/cython_tutorial.html#cython-hello-world

I created helloworld.pyx

print("Hello World")

and setup.py:

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

setup(
    ext_modules = cythonize("helloworld.pyx")
)

How can I change setup.py to specify that my source is Python 3, rather than Python 2 like in the tutorial? If I invoke "cython" command from the command line, it accepts -3 option. But if I compile with python setup.py build_ext --inplace like shown in the tutorial, how do I specify Python 3 source? It may not matter much for a Hello World program, but will matter as I start using Cython for real projects.

Answer

ead picture ead · Jan 1, 2019

One can pass language_level as an option to the cythonize-function in the setup.py-script:

extensions = cythonize(
               extensions, 
               compiler_directives={'language_level' : "3"})   # or "2" or "3str"
             ) 

Another possible syntax is

extensions = cythonize(extensions, language_level = "3")

The above might be more convenient than to add

#cython: language_level=3

to every pyx-file in the project, which might become necessary because since Cython 0.29 there is a warning, if the language_level isn't set explicitly:

/Main.py:367: FutureWarning: Cython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: XXXXXX.pyx
tree = Parsing.p_module(s, pxd, full_module_name)


Because language_level is a global setting, the decorator

cimport cython

@cython.language_level("3")
def do_something():
    pass

will not even be cythonized.