当前位置:  开发笔记 > 编程语言 > 正文

如何在Cython的setup.py中指定Python 3源?

如何解决《如何在Cython的setup.py中指定Python3源?》经验,为你挑选了2个好方法。

我正在尝试根据本教程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时,它会变得很重要。

非常感谢!



1> ead..:

可以将language_level一个选项作为选项传递给-script cythonize中的setup.py-function:

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

还是应该将该脚本解释为language_level=2Python2和language_level=3Python3(在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。



2> 小智..:

根据有关编译的官方文档,可以使用指令通过文件顶部的特殊标头注释来指定Python语言级别,如下所示:

#!python
#cython: language_level=3

似乎没有办法在setup.py中指定它。因此,如果您有许多Cython文件,则必须在每个文件中添加编译器指令。尽管到目前为止,我遇到的唯一需要此指令的情况就是您的示例中的print(),并且我已经广泛使用了Cython。

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有