Frage Cython + distutils bauen auf Ubuntu auf Python 3 ändert den Namen der Modulbibliothek während der Verknüpfung


Ich benutze Cython und Distutils. Während einer meiner Tests ist ein binäres Erweiterungsmodul gebaut. Danach wird einer meiner anderen Tests import das binäre Modul und testen Sie es. Auf Travis-CI ändert der Linker-Befehl den Namen. Siehe im Screenshot unten: der Compiler baut korrekt auf test01.o, aber der Linker erstellt falsch test01.cpython-34m.so: Ich will test01.so.

enter image description here

Der obige Screenshot ist für Python 3.4; Das Problem tritt bei Python 2.7 nicht auf, was mich vermuten lässt, dass die Python-spezifischen Distutils möglicherweise etwas anderes machen.

Die Distutils setup() Funktion, die von meinem Hauptskript aufgerufen wird, tut nichts besonderes:

setup(
    cmdclass = {'build_ext': build_ext},
    ext_modules = ext_modules,
    include_dirs=[numpy.get_include()]
)

Hier ext_modules ist eine Sequenz von Extension() Klassen, importiert von distutils.extension.

Ich habe die Distutils-Dokumentation für 2.7 und 3.4 gelesen und nichts springt mir so anders vor. Was könnte die Namensänderung verursachen und welche Optionen könnte ich angeben, entweder in setup() oder Extension() Instanziierung, um die Namensänderung zu verhindern?


Bearbeiten: Ich habe eine lokale VM mit Ubuntu 13.10 eingerichtet und kann bestätigen, dass, wie oben beschrieben, Python 2.7 erzeugt test01.so während Python 3.4 produziert test01.cpython-34m.so. Deshalb hat dieses Problem nichts mit travis-ci zu tun und ich entferne dieses Tag und bearbeite den Titel.


Bearbeiten: In der Tat ist es eine Veränderung zu distutils, in 3.2 gemacht. Ich bin immer noch dabei herauszufinden, was ich tun kann, damit meine Importaussage richtig aussieht.


Bearbeiten: OMG das Helloworld-Beispiel in den Python-Dokumenten erzeugt helloworld.cpython-34m.so auf Python 3.4.1 (Anaconda) auf Ubuntu 13.10. Pythons sysconfig Modul startet mit sysconfig.get_config_var('SO') == 'cpython-34m.so'.

Ich fühle eine Tirade.


5
2017-08-11 02:13


Ursprung


Antworten:


Das Rätsel wurde dank @ncoghlan_dev gelöst. Die Umbenennung wurde in geändert PEP 3149. Es stellt sich heraus, dass, obwohl das binäre Erweiterungsmodul so etwas wie aufgerufen werden könnte helloworld.cpython-34m.soWenn du in einem Python-Interpreter bist, import helloworld  funktioniert noch. Meine Travis - Tests scheiterten, weil ich einen Test hatte, der auf die Name der kompilierten .so Datei. Wenn ich diesen Test entferne, sollte der Rest der Datei noch funktionieren.


7
2017-08-11 23:43