2017-06-02 4 views
1

In einem Open-Source-Projekt 1 haben wir Python/Cython und C/C++ - Module mit einer C++ - Bibliothek mit der Python C-API gemischt. Die API hat nur einige Funktionsnamen von 2 auf 3 geändert. Angenommen, die Bibliothek wird ohne diese Funktionen geschrieben. Wird es mit Python3 verlinkt, wenn es mit Python2 kompiliert wird und umgekehrt? Wird dies durch Makros in den API-Headern verhindert?binär mit Python C API Version 2 und 3

Eine Bibliotheks-Binärdatei, die mit beiden verknüpft werden kann, würde uns große Verpackungsschwierigkeiten ersparen.

+0

Die Namen einiger ziemlich grundlegender Funktionen haben sich geändert (z. B. die Modulinitialisierung, denke ich), hauptsächlich um Sie daran zu hindern. – DavidW

+0

Die API ist relativ stabil, das A * B * I ist nicht. Also müssten Sie pro Python-Version neu kompilieren. Edit: Siehe den Link in @DavidW Kommentar zu Antti Haapala die Antwort unten für weitere Erklärungen zu diesem Thema. – Toby

Antwort

1

Nein, es würde nicht funktionieren. Versuche es nicht.

Binäre Module sind nicht garantiert binär-portabel, sogar von 3,5 bis 3,6. Wenn Sie Glück sind, dann gibt es einen Mechanismus, der Ihnen verbieten wird, diesen Wahnsinn zu tun. Wenn es Ihnen jedoch gelingt, die Bibliothek irgendwie zu verknüpfen, gibt es einige feine Unterschiede, die zu schwerwiegenden Fehlern führen, wie zum Beispiel das Ändern des Layouts von PyObject und so weiter.

Die Python-Schnittstelle muss für die genaue Python-Version neu kompiliert werden. Die Quellkompatibilität zwischen Python 2 und 3 ist etwas anderes und relativ einfach zu erreichen.

+2

Für Python> = 3.2 gibt es [eine stabile API] (https://docs.python.org/3/c-api/stable.html), die verwendet werden kann (ist aber etwas eingeschränkter als die vollständige API)). Offensichtlich hilft das nicht mit OP-Problem, aber es würde Ihnen erlauben, 3.5 und 3.6 in einem binären Modul zu machen. – DavidW

+0

Danke für die definitive Antwort und @DavidW für den Link. – rwst

Verwandte Themen