我正在尝试根据本教程http://docs.cython.org/src/tutorial/cython_tutorial.html#cython-hello-world在Cython中创建“ Hello World”程序
我创建了helloworld.pyx
print("Hello World")
和setup.py:
from distutils.core import setup from Cython.Build import cythonize setup( ext_modules = cythonize("helloworld.pyx") )
如何更改setup.py以指定源是Python 3,而不是本教程中的Python 2?如果我从命令行调用“ cython”命令,它将接受-3
选项。但是,如果我python setup.py build_ext --inplace
按照本教程中所示进行编译,该如何指定Python 3源?对于Hello World程序来说,它可能无关紧要,但是随着我开始在实际项目中使用Cython时,它会变得很重要。
非常感谢!
可以将language_level
一个选项作为选项传递给-script cythonize
中的setup.py
-function:
extensions = cythonize(extensions, compiler_directives={'language_level' : "3"})) # or "2" or "3str"
还是应该将该脚本解释为language_level=2
Python2和language_level=3
Python3(在IPython中,%% cython-magic的行为):
import sys # passing 3 or 2 as integer is also accepted: cythonize(extensions, compiler_directives={'language_level' : sys.version_info[0]})
另一种可能的语法是
extensions = cythonize(extensions, language_level = "3")
以上可能比添加更方便
#cython: language_level=3
到项目中的每个pyx文件,这可能是必要的,因为自Cython 0.29以来就有警告,如果language_level
未明确设置:
/Main.py:367:FutureWarning:未设置Cython指令'language_level',现在使用2(Py2)。这将在以后的版本中更改!档案:XXXXXX.pyx
tree = Parsing.p_module(s, pxd, full_module_name)
因为language_level
是全局设置,所以装饰器
cimport cython @cython.language_level("3") def do_something(): pass
甚至不会被cythonized。
根据有关编译的官方文档,可以使用指令通过文件顶部的特殊标头注释来指定Python语言级别,如下所示:
#!python #cython: language_level=3
似乎没有办法在setup.py中指定它。因此,如果您有许多Cython文件,则必须在每个文件中添加编译器指令。尽管到目前为止,我遇到的唯一需要此指令的情况就是您的示例中的print(),并且我已经广泛使用了Cython。