我正在尝试用Cython语言编写一个"Hello World“程序,遵循本教程的http://docs.cython.org/src/tutorial/cython_tutorial.html#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以指定我的源代码是Python3,而不是本教程中的Python2?如果我从命令行调用"cython“命令,它接受-3选项。但是,如果我像本教程中所示那样使用python setup.py build_ext --inplace进行编译,我如何指定Python3源代码?对于Hello World程序来说,这可能并不重要,但当我开始在实际项目中使用Cython时,它将变得非常重要。
发布于 2019-01-01 07:00:46
可以将language_level as an option传递给cythonize-function中的setup.py-script:
extensions = cythonize(
extensions,
compiler_directives={'language_level' : "3"}) # or "2" or "3str"
) 另一种可能的语法是
extensions = cythonize(extensions, language_level = "3")上面的内容可能比添加
#cython: language_level=3到项目中的每个pyx文件,这可能是必要的,因为从Cython0.29开始会有一个警告,如果language_level isn't set explicitly
/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甚至不会被Cython化。
发布于 2017-12-08 06:31:33
根据official documentation on compilation的说法,Python语言级别可以通过文件顶部的特殊头注释使用指令指定,如下所示:
#!python
#cython: language_level=3似乎没有一种方法可以在setup.py中指定这一点。因此,如果您有许多Cython文件,则必须向每个文件添加编译器指令。尽管到目前为止我遇到的唯一需要这个指令的情况是print(),就像您的示例中一样,而且我已经广泛地使用了Cython。
发布于 2019-09-26 19:58:46
如果您正在使用带有扩展名的setup.py,如此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
)然后,您必须添加以下代码片段来应用language_level指令(在设置(...)之前,谢谢codeman48):
for e in ext_modules:
e.cython_directives = {'language_level': "3"} #all are Python-3https://stackoverflow.com/questions/34603628
复制相似问题