使用2to3将cython文件从python2移植到python3

时间:2017-11-04 20:01:56

标签: python cython python-2to3

我有一个在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))

1 个答案:

答案 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应该处理)编译它,它应该可以工作。你可能需要解决一些小问题。