Distutils schlägt scheinbar mit einer (funktionierenden) SWIG-Erweiterung fehl

8

Ich verpacke über SWIG eine C-Bibliothek in einem Python-Modul, hier "myExample" genannt. Wenn ich kompiliere:

%Vor%

Ich erhalte ein voll funktionierendes Modul (liblapacke ist für einige Funktionen notwendig). Jetzt möchte ich dieses Modul über "pip install" installierbar machen.

Laut dem Abschnitt distutils ( Ссылка ) habe ich meine setup.py-Datei geschrieben:

%Vor%

und bearbeitet MANIFEST.in in einer Weise, die Quellen zu erhalten und Probleme zu vermeiden, wie in ähnlichen Fragen auf dieser Website (d. h. einschließlich myExample.h und myExample.c). Dann renne ich:

%Vor%

und das über "pip install" installierbare Paket erhalten. Es schien getan zu sein (keine Fehler, keine Warnungen), aber ... es funktioniert nicht . In diesem installierbaren Modul ("_myExample.so" - beachten Sie die Unterstreichung, scheint es von Distutils erforderlich [vielleicht versteckt es eine Antwort?]) Einige Methoden sind unterschiedlich, einige fehlen, etc ... Folglich entschied ich mich zu ein Schritt pro Zeit. Indem ich einfach kompiliere:

%Vor%

Ich habe bereits das gleiche Problem bekommen: das letzte Modul unterscheidet sich von dem, das man über die übliche, zu Beginn erläuterte Zusammenstellung erhält.

Zusammenfassend: Bei einer SWIG-Schnittstelle führt das traditionelle Übersetzen oder Kompilieren über Distutils zu einem anderen Ergebnis. Wie könnte es möglich sein? Ist meine setup.py falsch? Gibt es vielleicht eine alternative Möglichkeit, ein pip-installierbares Modul zu erhalten, ohne auf Distutils oder setuptools angewiesen zu sein (was die gleichen Probleme verursacht)?

Ps: Der Wrap-Code ist sehr lang und daher kann ich leider keine detaillierte Liste geben, aber ich bin voll verfügbar, wenn ich mehr benötige. Zum Beispiel enthält die manuell kompilierte Schnittstelle erfolgreich die "AdaptiveInterpolation" (funktioniert gut), während die disttitil erzeugte "AdaptiveInterpolation_set", "AdaptiveInterpolation_get", oder es gibt viele Methoden, die mit "new_" beginnen (in meinem Original nicht vorhanden) Code).

    
user233650 16.02.2018, 14:56
quelle

1 Antwort

2

Praktisch gibt es zwei Optionen für die Verteilung eines solchen Pakets: bdist_wheel und sdist .

Nehmen wir das SWIG-Beispiel aus den Dokumenten für distutils .

Beispiel.h

%Vor%

Beispiel.c

%Vor%

Beispiel.i

%Vor%

Lassen Sie uns eine SWIG-Schnittstelle erstellen, die standardmäßig example_wrap.c erzeugt.

%Vor%

Rad

Python Wheels ist ein modernes Distributionsformat, das die Verteilung von vorgefertigten Paketen vereinfacht (dh Benutzer des Pakets werden es tun) brauche keinen Compiler, Entwicklungsheader und ähnliches um es zu installieren). Um es zu verwenden, benötigen wir setuptools und wheel (kann mit pip oder von OS-Repositories installiert werden, sudo apt-get install python-wheel python-setuptools ).

setup.py

%Vor%

Sie können das Rad mit:

bauen %Vor%

Auf meinem Rechner wird example-0.1-cp27-cp27mu-linux_x86_64.whl erzeugt, das ich mit pip installieren und wie python -c 'import example; print(example.fact(5))' testen kann. Notieren Sie den Dateinamen. Es codiert kompatible Python-Version, ABI und Plattform. Hier ist eine Auflistung der Inhalte ( unzip -l ... ).

%Vor%

Um Räder mit besserer Kompatibilität zu erstellen, können Sie sich beispielsweise manylinux ansehen.

Quelle

sdist steht für Quellenverteilung , was bedeutet, dass Ihre Benutzer einen Compiler und relevante Entwicklungsabhängigkeiten benötigen. Die Quellverteilung ist aufgebaut mit:

%Vor%

Produziert example-0.1.tar.gz enthält ( tar -tf ... ):

%Vor%     
saaj 24.02.2018 15:18
quelle

Tags und Links