Frage

Ich habe gerade entdeckt http://code.google.com/p/re2, eine vielversprechende Bibliothek, die einen lang vernachlässigten Weg verwendet (Thompson NFA) Um eine reguläre Expressions -Engine zu implementieren, die schneller Ordnungen von Größen sein kann als die verfügbaren Motoren von AWK, Perl oder Python.

Also habe ich den Code heruntergeladen und das üblich gemacht sudo make install Ding. Diese Aktion hatte jedoch scheinbar kaum mehr getan als hinzuzufügen /usr/local/include/re2/re2.h zu meinem System. Es schien einige zu geben,.afile in addition, but then what is it with this.A`` Erweiterung?

Ich möchte RE2 von Python (vorzugsweise Python 3.1) verwenden und freute sich darauf, Dateien wie zu sehen make_unicode_groups.py in der Distribution (vielleicht nur während des Build -Prozesses verwendet?). Diejenigen wurden jedoch nicht auf meiner Maschine eingesetzt.

Wie kann ich RE2 von Python verwenden?


aktualisieren Zwei freundliche Leute haben darauf hingewiesen, dass ich versuchen könnte, DLLs / *. So -Dateien aus den Quellen zu erstellen und dann Python zu verwenden ctypes Bibliothek, um auf diese zuzugreifen. Kann jemand nützliche Hinweise geben, wie man genau das macht? Ich bin hier ziemlich ahnungslos, besonders mit dem ersten Teil (Erstellung der *.so -Dateien).


aktualisieren Ich habe diese Frage auch (früher) in die gepostet RE2 -Entwicklergruppe, ohne Antwort bis jetzt (es ist eine kleine Gruppe) und heute zu (etwas bevölkerungsreicher) comp.lang.py Gruppe - Thread hier -. Die Hoffnung ist, dass Menschen aus verschiedenen Ecken sich gegenseitig kontaktieren können. Meine Vermutung ist, dass eine erfahrene Person dies in wenigen Stunden während ihrer 20% -Fre-Time-To-Google-Too-Zeitklappe tun kann. Es würde mich wochenlang binden. Gibt es ein Werkzeug, um C ++ automatisch zu dem Geschmack von C, das Python benötigt, um eine Verbindung herzustellen? Vielleicht kann ein praktikables Ergebnis auf clevere Werkzeugkettung reduziert werden.

(Rant) Warum ist das so schwierig? Zu denken, dass wir 2010 immer noch nicht unsere reichlich vorhandenen Software haben können, nur miteinander zu sprechen. Dies ist so eine Straßensperre, dass Sie diese Verknüpfungsbits immer zerfetzen müssen, wenn Sie einen C -Code von Python ansprechen möchten. Dies erfordert viel Arbeit, liefert jedoch nur ein Erweiterungsmodul, das spezifisch für die Version des C -Codes und die Version von Python ist. Wäre es möglich, solche Dinge in getrennten Prozessen auszuführen (sagen wir, wenn ich eine ausführbare RE2 -Datei hätte, die Ergebnisse für Daten erzielen kann, die beispielsweise auf die Daten eingehen. subprocess/Popen/communicate())? (Dies sollte kein reines Befehlszeilen-Tool sein, das jedes Mal die Öffnung eines Prozesses erfordert, wenn er benötigt wird, sondern ein einzelner Prozess, der kontinuierlich ausgeführt wird. Vielleicht gibt es Wrapper, die einen solchen C-Code "dämonisieren").

War es hilfreich?

Lösung

David Reiss hat einen Python -Wrapper für RE2 zusammengestellt. Es hat nicht die gesamte Funktionalität von Pythons Re -Modul, aber es ist ein Start. Es ist hier erhältlich: http://github.com/facebook/pyre2.

Andere Tipps

Möglicherweise ja, einfach nein. Wenn man sich die RE2.H ansieht, ist dies eine C ++ - Bibliothek, die als Klasse ausgesetzt ist. Es gibt zwei Möglichkeiten, wie Sie es von Python verwenden können.

1.) Wie Tuomas sagt, kompilieren Sie es als DLL/so und verwenden Sie CTypes. Um es von Python aus zu verwenden, müssten Sie das Objekt init und die Methoden in exterte Funktionen im C -Stil einwickeln. Ich habe dies in der Vergangenheit mit CTYPES gemacht, indem ich Funktionen, die einen Zeiger auf das Objekt übergeben, auspunkte. Die "init" -Funktion gibt einen Hohlraumzeiger auf das Objekt zurück, das jeden nachfolgenden Methodenaufruf übergeben wird. Sehr chaotisch.

2.) Wickeln Sie es in ein echtes Python -Modul ein. Auch diese Funktionen, die Python ausgesetzt sind, müssten extern "C" sein. Eine Option ist die Verwendung Boost.Python, das würde diese Arbeit lindern.

SCHLUCK Griffe C ++ (im Gegensatz zu CTypes), sodass es möglicherweise einfacher ist, es zu verwenden.

Sie könnten versuchen, RE2 in seine eigene DLL/so zu bauen und CTypes zu verwenden, um Funktionen von dieser DLL/so aufzurufen. Sie müssen wahrscheinlich Ihre eigenen Einstiegspunkte in der DLL/SO definieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top