8 Stimmen

Kombiniertes Python- & Ruby-Erweiterungsmodul

Ich habe ein C-Erweiterungsmodul für Python und möchte es den Rubyisten zur Verfügung stellen.

Der Quelltext enthält eine Reihe von C-Modulen, von denen nur eines von Python abhängig ist. Der Rest hängt nur voneinander und von der Standardbibliothek ab. Ich kann es bauen mit python setup.py build auf die übliche Weise.

Ich habe mit dem Hinzufügen von Ruby-Unterstützung experimentiert, indem ich newgem und ich kann eine Version der Erweiterung erstellen mit rake gem . Der kombinierte Quellcode hat jedoch ein hässliches Verzeichnis-Layout (eine Mischung aus Gem- und Setuptools-Strukturen), und der Build-Prozess ist ein Klotz am Bein.

Ich kann nicht einfach alle Quellen im selben Verzeichnis aufbewahren, weil mkmf erkennt automatisch das von Python abhängige Modul und versucht, es zu kompilieren, und die Benutzer sollten Python nicht installieren müssen, um ein Modul zu kompilieren, das nicht verwendet wird. Mein aktueller Hack ist für extconf.rb um die Python-unabhängigen Quelldateien in dasselbe Verzeichnis wie das Ruby-abhängige Erweiterungsmodul zu kopieren.

Gibt es einen vernünftigeren Weg, den Code für beide Sprachen verfügbar zu machen? Sollte ich einfach den Python-unabhängigen Code in einem separaten Gem duplizieren? Sollte ich den unabhängigen Code als separate, mit Autotools erstellte Bibliothek veröffentlichen? Gibt es eine Version von mkmf die das unerwünschte Modul auslassen kann?

5voto

Johan Dahlin Punkte 23232

Eine Möglichkeit, dieses Problem zu lösen, besteht darin, drei verschiedene Projekte zu erstellen:

  • Die Bibliothek selbst, unabhängig von python & ruby
  • Python-Bindungen
  • Ruby-Bindungen

Das ist wahrscheinlich die sauberste Lösung, auch wenn es ein bisschen mehr Arbeit erfordert, wenn man Releases macht, aber es hat den Vorteil, dass man eine neue Version der Ruby Bindings veröffentlichen kann, ohne eine neue Version der Bibliothek/Python Bindings ausliefern zu müssen.

0voto

David Punkte 16960

Ergänzend zu dem, was Johan sagte, habe ich ein paar c/c++ Unterstützung Bibliotheken in Python dank swig verwendet. Sie schreiben Ihren Code in C/C++ und erstellen dann eine Zwischenvorlage für jede Sprache, die Sie unterstützen möchten. Es ist ziemlich schmerzlos für Python, aber einige Überlegungen müssen für Ruby gemacht werden... nämlich ich glaube nicht, pthread Unterstützung ist zu glücklich mit Ruby oder umgekehrt.

http://www.swig.org/ Die Lernkurve ist etwas steil, daher ist es vielleicht am besten, ein Beispielprojekt zu finden, das zeigt, wie man den Wrapper für die Zielsprachen verwendet.

Dies ist definitiv ein nützliches Tool, da es Ihren Code viel sauberer macht und gleichzeitig robuste Bindungen zu mehreren Sprachen bietet (PHP, Python, Ruby und ich glaube c#)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X