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

新手上路,请多包涵

我正在尝试按照本教程 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 用于实际项目时,它就很重要了。

原文由 rsteward 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
1 个回答

可以将 language_level 作为选项 传递给 cythonize setup.py 的函数:

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

另一种可能的语法是

ext_modules = 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。

原文由 ead 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题