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

后端 未结 3 1735
孤城傲影
孤城傲影 2020-12-01 06:04

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 c

相关标签:
3条回答
  • 2020-12-01 06:44

    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.

    0 讨论(0)
  • 2020-12-01 06:46

    If you are using a setup.py with Extension, as in this example

    from distutils.core import setup
    from distutils.extension import Extension
    from Cython.Distutils import build_ext
    
    ext_modules = [
        Extension("mymodule1",  ["mymodule1.py"]),
        Extension("mymodule2",  ["mymodule2.py"]),
    ]
    
    setup(
        name = 'My Program Name',
        cmdclass = {'build_ext': build_ext},
        ext_modules = ext_modules
    )
    

    then you have to add the following snippet to apply the language_level directive (BEFORE the setup(...), thanks codeman48):

    for e in ext_modules:
        e.cython_directives = {'language_level': "3"} #all are Python-3
    
    0 讨论(0)
  • 2020-12-01 06:52

    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.

    0 讨论(0)
提交回复
热议问题