Domanda

Ho appena scoperto http://code.google.com/p/re2 , un biblioteca promettente che utilizza un modo lungo trascurato ( Thompson NFA ) per implementare un'espressione regolare motore che può essere ordini di grandezza più veloce rispetto ai motori disponibili awk, Perl, Python o.

Così ho scaricato il codice e ha fatto la solita cosa sudo make install. tuttavia, che l'azione aveva apparentemente fatto poco più che aggiungere /usr/local/include/re2/re2.h al mio sistema. ci sembrava di essere un po ` .afile in addition, but then what is it with this .a`` estensione` `?

Vorrei utilizzare RE2 da Python (preferibilmente Python 3.1) ed ero entusiasta di vedere i file come make_unicode_groups.py nella distro (forse solo utilizzati durante il processo di generazione?). quelli, tuttavia, non sono stati schierati sulla mia macchina.

Come posso utilizzare RE2 da Python?


Aggiorna due persone amiche hanno fatto notare che ho potuto provare a costruire DLL / * .so file dalle fonti e quindi utilizzare libreria ctypes di Python per accedere a tali. chiunque può dare indicazioni utili su come fare proprio questo? io sono praticamente all'oscuro qui, soprattutto con la prima parte (la costruzione dei file * .so).


Aggiorna ho anche postato questa domanda (in precedenza) per il RE2 gruppo sviluppatori, senza risposta fino ad ora (si tratta di un piccolo gruppo), e oggi alla (un po 'più popolosa) comp.lang.py gruppo [- infilare qui-] . la speranza è che le persone provenienti da vari angoli possono mettersi in contatto tra loro. La mia ipotesi è una persona esperta può farlo in poche ore durante il loro 20% your-tempo libero-appartiene-google-troppo timeslice; mi legherebbe per settimane. c'è uno strumento per automaticamente muto-premuto C ++ per qualunque sapore di C che Python deve essere in grado di connettersi? , quindi forse ottenere un risultato praticabile può essere ridotto a intelligente concatenamento strumento.

(sproloquio) perché è così difficile? a pensare che nel 2010 ancora non possiamo avere i nostri abbondanti pezzi di software solo parlare gli uni agli altri. questo è un tale posto di blocco che ogni volta che si desidera affrontare qualche codice C da Python è sempre necessario cruft questi bit di collegamento. questo richiede un sacco di lavoro, ma fornisce solo un modulo di estensione che è specifico per la versione del codice C e la versione di Python, quindi invecchia in fretta. (/ rant) sarebbe possibile eseguire queste cose in processi separati (per esempio se ho avuto un eseguibile RE2 che può produrre risultati per i dati che viene in su, per esempio, subprocess/Popen/communicate())? (questo non dovrebbe essere uno strumento di puro riga di comando che richiede l'apertura di un processo ogni volta che è necessario, ma un unico processs che funziona continuamente, forse esistono involucri quella sorta di 'demonizzare' tale codice C)

.
È stato utile?

Soluzione

David Reiss ha messo insieme un wrapper Python per RE2. Non ha tutte le funzionalità del modulo re di Python, ma è un inizio. E 'disponibile qui:. http://github.com/facebook/pyre2

Altri suggerimenti

possibile Sì, non facile. Guardando il re2.h, questa è una libreria C ++ esposto come una classe. Ci sono due modi si può usare da Python.

1). Come dice Tuomas, compilarlo come una DLL / così e utilizzare ctypes. Al fine di utilizzarlo in pitone, però, si avrebbe bisogno di avvolgere l'init oggetto e metodi in funzioni externed c di stile. Ho fatto questo in passato con ctypes da funzioni che passano un puntatore all'oggetto intorno externing. La funzione "init" restituisce un puntatore nullo all'oggetto che viene trasmesso ogni successivo richiamo metodo. Molto disordinato davvero.

2.) Avvolgere in un vero e proprio modulo Python. Anche in questo caso le funzioni esposte al pitone sarebbe bisogno di essere extern "C". Una possibilità è quella di utilizzare Boost.Python , che sarebbe facilitare questo lavoro.

SWIG maniglie C ++ (a differenza ctypes), quindi potrebbe essere più semplice da utilizzare.

Si potrebbe provare a costruire re2 nella propria DLL / così e utilizzare ctypes per richiamare le funzioni da quella DLL / così. Probabilmente avrete bisogno di definire i propri punti di ingresso nella DLL / SO.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top