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)
如果有人有解决方案,请告诉我。谢谢。
默认情况下,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还应该构成问题中最少完整示例的一部分)