首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Cython的setup.py中指定Python3源代码?

如何在Cython的setup.py中指定Python3源代码?
EN

Stack Overflow用户
提问于 2016-01-05 11:14:34
回答 3查看 40.2K关注 0票数 77

我正在尝试用Cython语言编写一个"Hello World“程序,遵循本教程的http://docs.cython.org/src/tutorial/cython_tutorial.html#cython-hello-world

我创建了helloworld.pyx

代码语言:javascript
复制
print("Hello World")

setup.py

代码语言:javascript
复制
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时,它将变得非常重要。

EN

回答 3

Stack Overflow用户

发布于 2019-01-01 07:00:46

可以将language_level as an option传递给cythonize-function中的setup.py-script:

代码语言:javascript
复制
extensions = cythonize(
               extensions, 
               compiler_directives={'language_level' : "3"})   # or "2" or "3str"
             ) 

另一种可能的语法是

代码语言:javascript
复制
extensions = cythonize(extensions, language_level = "3")

上面的内容可能比添加

代码语言:javascript
复制
#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是一个全局设置,所以装饰器

代码语言:javascript
复制
cimport cython

@cython.language_level("3")
def do_something():
    pass

甚至不会被Cython化。

票数 84
EN

Stack Overflow用户

发布于 2017-12-08 06:31:33

根据official documentation on compilation的说法,Python语言级别可以通过文件顶部的特殊头注释使用指令指定,如下所示:

代码语言:javascript
复制
#!python
#cython: language_level=3

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

票数 35
EN

Stack Overflow用户

发布于 2019-09-26 19:58:46

如果您正在使用带有扩展名的setup.py,如此example所示

代码语言:javascript
复制
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):

代码语言:javascript
复制
for e in ext_modules:
    e.cython_directives = {'language_level': "3"} #all are Python-3
票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34603628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档