2017-11-04 5 views
1

Ich habe ein Python-Paket, das unter Python2.7 entwickelt wurde, aber ich muss es nach Python3.6 portieren. Ich verwende Cython in einigen Teilen des Codes, daher hat das Paket sowohl .py als auch .pyx Dateien.Portierung von Cython-Dateien von Python2 nach Python3 mit 2to3

Ich habe versucht, die 2to3 Befehl, aber ich habe einen Fehler, den ich weder verstehen noch lösen konnte.

Beispiel: Ich habe folgende test.pyx Datei

# cython: profile=False 
cimport cython 

@cython.boundscheck(False) 
@cython.wraparound(False) 
@cython.profile(False) 
cpdef sillyfunction(): 
    print 'Thank you for your kind help' 
    return 

und ich laufe 2to3 test.pyx. Was ich erhalte, ist:

[email protected]:~$ 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)) 

Antwort

2

Sie sollten nichts tun müssen. Cython akzeptiert ein Argument language_level (siehe http://cython.readthedocs.io/en/latest/src/reference/compilation.html#compiler-directives), das steuert, wo es den Code als Python 2 oder Python 3 interpretiert (zum Beispiel print als eine Funktion oder als eine Anweisung).

Was auch immer Sie tun, der Code, den er generiert, sollte für die Verwendung mit Python 2 oder Python 3 kompilierbar sein (dies wird durch die von Ihnen eingeschlossenen Header bestimmt, die größtenteils durch den Build-Prozess angeordnet werden). Es gibt viele Präprozessor #if PY_MAJOR_VERSION >= 3 Abschnitte in dem generierten C-Code, um dies zu gewährleisten.

Ich vermute, dass es einige Einschränkungen auf dieser Kompatibilität ist, und ich würde nicht erwarten, dass alle Python 3-Funktionen perfekt funktionieren, wenn sie gegen Python kompilieren 2, aber als allgemeine Regel sollten Sie in der Lage sein, Ihren vorhandenen Cython Code zu nehmen , führe Cython mit language_level=2 (dem Standard) aus und kompiliere es dann mit den Python 3-Headers/Bibliotheken (für die sich setup.py standardmäßig kümmern sollte) und es sollte funktionieren. Es kann kleine, spezifische Probleme geben, die Sie umgehen müssen.

Verwandte Themen