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.
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.
According to official documentation on compilation, the Python language level can be specified using a directive through a special header comment at the top of the file, like this:
#!python #cython: language_level=3
There doesn't seem to be a way to specify this in setup.py. So if you have many Cython files, you'd have to add the compiler directive to each file. Although the only situation I've met so far that needs this directive is for print() as in your sample, and I've used Cython extensively.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With