我有一个在python2.7下开发的python包,但我需要将它移植到python3.6。我在代码的某些部分使用cython,因此包中包含.py
和.pyx
个文件。
我尝试了2to3
命令,但是我收到了一个错误,我既不理解也不解决。
示例:我有以下test.pyx
文件
# cython: profile=False
cimport cython
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.profile(False)
cpdef sillyfunction():
print 'Thank you for your kind help'
return
我运行2to3 test.pyx
。我得到的是:
user@machine:~$ 2to3 test.pyx
RefactoringTool: Skipping optional fixer: buffer
RefactoringTool: Skipping optional fixer: idioms
RefactoringTool: Skipping optional fixer: set_literal
RefactoringTool: Skipping optional fixer: ws_comma
RefactoringTool: Can't parse test.pyx: ParseError: bad input: type=1, value=u'cython', context=(u' ', (2, 8))
RefactoringTool: No files need to be modified.
RefactoringTool: There was 1 error:
RefactoringTool: Can't parse test.pyx: ParseError: bad input: type=1, value=u'cython', context=(u' ', (2, 8))
答案 0 :(得分:2)
你不需要做任何事情。 Cython接受一个参数language_level
(参见http://cython.readthedocs.io/en/latest/src/reference/compilation.html#compiler-directives),它控制将代码解释为Python 2或Python 3的位置(例如print
作为函数或语句)。
无论你做什么,它生成的代码都应该可以编译为与Python 2或Python 3一起使用(这取决于你包含的头文件,这主要由构建过程安排)。生成的C代码中有许多预处理器#if PY_MAJOR_VERSION >= 3
部分可以确保这一点。
我怀疑这种兼容性存在一些限制,我当然不希望所有Python 3功能在针对Python 2编译时都能正常工作,但作为一般规则,您应该能够获取现有的Cython代码,使用language_level=2
(默认)运行Cython,然后使用Python 3标头/库(默认情况下setup.py应该处理)编译它,它应该可以工作。你可能需要解决一些小问题。