Cython 编译器错误

J.V*_*iel 1 python compiler-errors cython

我无法找到太多关于此的信息,但是当尝试使用 cython 编译我的一个 python 脚本时,它给了我这个错误:

Error compiling Cython file:
------------------------------------------------------------
...
import traceback #line:24
import bcrypt #line:25
Y =str (os .path .dirname (os .path .abspath (__file__ )))#line:28
IH =open #line:29
IA =str #line:30
IK =print #line:31
   ^
------------------------------------------------------------

headlessobfu.pyx:29:4: Expected an identifier or literal
Traceback (most recent call last):
  File "setup.py", line 5, in <module>
    ext_modules = cythonize("headlessobfu.pyx")
  File "C:\Users\justi\AppData\Local\Programs\Python\Python36-32\lib\site-packages\Cython\Build\Dependencies.py", line 1026, in cythonize
    cythonize_one(*args)
  File "C:\Users\justi\AppData\Local\Programs\Python\Python36-32\lib\site-packages\Cython\Build\Dependencies.py", line 1146, in cythonize_one
    raise CompileError(None, pyx_file)
Cython.Compiler.Errors.CompileError: headlessobfu.pyx
Run Code Online (Sandbox Code Playgroud)

我一直无法找到此错误的确切原因。我能够得到简单的脚本来编译就好了。蟒蛇自己运行得很好。我的python格式有问题吗?

这是我正在运行的命令行参数:

py setup.py build_ext --inplace
Run Code Online (Sandbox Code Playgroud)

如果有人有解决方案,请告诉我。谢谢。

Dav*_*idW 6

默认情况下,Cython 假定 Python 2 语法,即使您使用的是 Python 3(编辑 2021:Cython 3 将改变这一点,并在很大程度上默认使用 Python 3 语法)。这是您应该创建的最小的、完整的示例:

cy_print_test.pyx

x = print
Run Code Online (Sandbox Code Playgroud)

如果我用 Cython 编译它

cython cy_print_test.pyx
Run Code Online (Sandbox Code Playgroud)

我收到了你做的错误信息。print不是标识符或文字,因为在 Python 2 语法下它是一个特殊语句。

但是,如果我将 Cython 编译为使用 Python 3 语法:

cython -3 cy_print_test.pyx
Run Code Online (Sandbox Code Playgroud)

它工作正常 - 在 Python 3 语法下,print 是一个函数,所以这很有意义。


获取 Python 3 语法的替代方法是将以下行添加到 .pyx 文件的开头

#cython: language_level=3
Run Code Online (Sandbox Code Playgroud)

或将其指定为编译器指令setup.py

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize('cy_print_test.pyx', compiler_directives={'language_level': 3}),
)
Run Code Online (Sandbox Code Playgroud)

(请注意,您setup.py还应该构成问题中最少完整示例的一部分)