[python-users] Kompilierte C-Extension in ein Egg verpacken

M.-A. Lemburg mal at egenix.com
Mi Dez 5 21:55:17 CET 2012


On 05.12.2012 21:38, Andi Albrecht wrote:
> 2012/12/5 M.-A. Lemburg <mal at egenix.com>:
>> On 05.12.2012 16:19, Andi Albrecht wrote:
>>> Hallo zusammen,
>>>
>>> ich bin gerade ein bißchen ratlos.... Ich versuche, eine kompilierte
>>> C-Extension in ein Paket zu verpacken, damit ich sie via pip
>>> installieren kann.
>>>
>>> Bisher bin ich aber noch auf keinen vernünftigen Ansatz gestoßen, wie
>>> ich mir da Pakete für die unterschiedlichen Platformen basteln kann.
>>> Ich hatte gehofft, eine einfache setup.py schreiben zu können, der ich
>>> irgendwie (<-- da scheitere ich) sagen kann: Das ist die *.so-Datei,
>>> um dann mit "python setup.py bdist_egg --plat_name=platform" ein egg
>>> zu erzeugen.
>>>
>>> Das einzige, was bisher funktioniert hat, war ein Dummy-Modul zu bauen
>>> und die so-Datei als package_data mit zu paketieren:
>>>
>>> mymodule/
>>>   __init__,py  (from mymodule import *)
>>>   mymodule.so
>>>
>>> Das fühlt sich aber komisch an. Aber vielleicht bin ich auch nur gerade blind.
>>>
>>> Hat jemand sowas schonmal gemacht oder kennt jemand einen einfachen
>>> Weg, eine vorkompilierte C-Extension zu paketieren?
>>
>> Normalerweise muß man distutils die C-Extension kompilieren lassen,
>> damit die .so Datei auch im Paket landet.
>>
>> Falls das nicht geht, kann man aber auch per data_files die
>> Dateien mitliefern:
>>
>> http://docs.python.org/2.7/distutils/setupscript.html#installing-additional-files
> 
> Das Problem, dass ich mit data_files habe, ist, dass die so-Datei dann
> erstmal nicht im PYTHONPATH landet. pkg_data kann ich in diesem Fall
> auch nicht verwenden, da ich gar kein Package habe. Ich habe lediglich
> eine einzige so-Datei (ein Python-Modul in C) und kann es leider auch
> nicht selbst kompilieren, da es ein proprietäres Modul ist, dass ich
> nur kompiliert erhalte.

Dann nimm einfach die von Dir oben aufgeführte Variante mit
einem Wrapper-Package.

Das hat auch gleich noch ein paar andere Vorteile: Du kannst dann
z.B. Funktionen ergänzen, den Import der C-Extension überprüfen und
eine sinnvolle Fehlermeldung ausgeben, Logging des Imports
hinzufügen, etc.

Wir machen das bei den mx-Extensions schon seit vielen Jahren so,
u.a. um zwischen Pure-Python- und C-Implementierungen bei Bedarf
zu wechseln.

PS: Wichtig ist, daß Du auch die Symbole mit Unterstrich importierst,
z.B. __version__. Die kommen nämlich beim "... import *" nicht mit.

-- 
Marc-Andre Lemburg
eGenix.com

Professional Python Services directly from the Source  (#1, Dec 05 2012)
>>> Python Projects, Consulting and Support ...   http://www.egenix.com/
>>> mxODBC.Zope/Plone.Database.Adapter ...       http://zope.egenix.com/
>>> mxODBC, mxDateTime, mxTextTools ...        http://python.egenix.com/
________________________________________________________________________
2012-12-05: Released eGenix pyOpenSSL 0.13 ...    http://egenix.com/go37
2012-11-28: Released eGenix mx Base 3.2.5 ...     http://egenix.com/go36
2013-01-22: Python Meeting Duesseldorf ...                 48 days to go

::::: Try our mxODBC.Connect Python Database Interface for free ! ::::::

   eGenix.com Software, Skills and Services GmbH  Pastor-Loeh-Str.48
    D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
           Registered at Amtsgericht Duesseldorf: HRB 46611
               http://www.egenix.com/company/contact/



Mehr Informationen über die Mailingliste python-users