2011-01-15 4 views
7

Wenn ich ein Python-Paket habe, das von einigen C-Bibliotheken abhängt (wie zB die Gnu Scientific Library (GSL) für numerische Berechnungen), ist es eine gute Idee, die Bibliothek mit meinem Code zu bündeln?Sollte ich C-Bibliotheken mit meiner Python-Anwendung bündeln?

Ich möchte mein Paket so einfach wie möglich für Benutzer zu installieren und ich möchte nicht, dass sie C-Bibliotheken manuell herunterladen müssen und Include-Pfade bereitstellen. Auch könnte ich immer sicherstellen, dass die Version der Bibliothek, die ich schicke, mit meinem Code kompatibel ist.

Ist es jedoch möglich, dass es Konflikte gibt, wenn der Benutzer die Bibliothek bereits installiert hat, oder gibt es andere Gründe, warum ich das nicht tun sollte?

Ich weiß, dass ich es für Benutzer einfacher machen kann, indem Sie nur eine Binärdistribution bereitstellen, aber ich möchte vermeiden, dass Binärdistributionen für alle möglichen Betriebssysteme beibehalten werden müssen. Also möchte ich bei einer Quelldistribution bleiben, aber für den Benutzer (der stolz einen C-Compiler besitzt) sollte die Installation so einfach sein wie python setup.py install.

Antwort

0

Sie könnten zwei separate Zweige des src haben, von denen einer die Bibliotheken enthält und der andere nicht. Auf diese Weise können Sie Ihre Benutzer explizit warnen, falls sie die Bibliotheken installiert haben. Eine andere Lösung könnte sein (wenn die Lizenzen der Bibliotheken es erlauben), sie in eine einzige Datei zu verpacken.

Ich denke, es gibt keine einzigartige Lösung, aber das sind die Ideen, die ich bisher denken konnte.

Viel Glück

0

können Sie virtualenv verwenden einen eigenen Python-Umgebung für Ihre Anwendung zu erstellen. Dies vermeidet Konflikte mit anderen Bibliotheken. Am besten packen Sie Module und Abhängigkeiten wie z. B. Ihre Bibliotheken mit Distribute. Distutils ist etwas anderes, das es wert ist, erforscht zu werden.

4

Die Verteilung ist einer der schwierigsten Teile für jedes Softwareprojekt. Java und .NET heben einen Teil dieser Last auf, indem sie eine Standardlaufzeit definieren und dann einfach nur "alles andere verteilen" sagen. Natürlich gibt es einen Nachteil: Alles muss in einer Sprache neu geschrieben werden, die von der Laufzeit unterstützt wird - sobald Sie nativen Code verwenden möchten, verlieren Sie alle Vorteile.

Das ist in Python schwieriger als in Ruby, C, C++ und anderen Sprachen, da sie normalerweise vorhandene native Bibliotheken nutzen.

Generell gilt:

  1. Machen Sie es möglich, eine Quelle Sdist über pypi.python.org als Beispiel zu erhalten. Korrigieren Sie Ihre Installationsanforderungen (wahrscheinlich benötigen Sie Python-Bindungen für GSL, nicht GSL selbst). Verwenden Sie Standard-Setup-Tools/Layout verteilen. Dadurch kann jeder - beispielsweise ein Paketverwalter für jede Distribution - Ihre Software abholen und verpacken.

  2. Ziehen Sie darüber hinaus die Bereitstellung eines vollständig installierbaren Pakets für Ihre Zielgruppe in Betracht. Sie müssen nicht alle Distributionen und das Betriebssystem unterstützen. Wähle ein oder zwei aus, von denen du denkst, dass sie am meisten benutzt werden. Mit Tools wie PyInstaller können Sie ein installierbares, lauffähiges Paket für viele Betriebssysteme erstellen, aber besonders für Linux möchten Sie vielleicht, dass der Benutzer die eigene Version der transitiven Deps installiert (libgsl?) - Sie benötigen eine vollständige deb oder RPM-Paket, um das zu befriedigen - wieder, versuchen Sie nicht, alle und alle Distributionen zu unterstützen, werden Sie verrückt werden. Unterstützen Sie etwas, das Sie am meisten verwenden, und lassen Sie andere Benutzer Ihnen bei anderen Verpackungsanforderungen helfen.

Werfen Sie auch einen Blick auf Python Packaging Guide

Verwandte Themen