Pregunta

http://code.google.com/p/re2 , una biblioteca prometedora que utiliza un modo descuidado durante mucho tiempo ( Thompson NFA ) para implementar una expresión regular motor que puede ser órdenes de magnitud más rápido que los motores disponibles de awk, Perl o Python.

Así que he descargado el código y lo hice sudo make install habitual. Sin embargo, esa acción aparentemente había hecho poco más que añadir /usr/local/include/re2/re2.h a mi sistema. parecía que había un poco de `` ` .afile in addition, but then what is it with this .a`` extensión?

Me gustaría utilizar RE2 desde Python (preferiblemente Python 3.1) y tenía ganas de ver archivos como make_unicode_groups.py en la distro (tal vez sólo se utilizan durante el proceso de construcción?). Sin embargo los que no se desplegaron en mi máquina.

¿Cómo puedo utilizar RE2 desde Python?


actualización dos personas amistosas han señalado que yo podría tratar de construir DLL / * .so archivos de las fuentes y luego utilizar la biblioteca de Python ctypes acceder a ellos. nadie puede dar indicaciones útiles de cómo hacer eso? estoy bastante desorientado aquí, especialmente con la primera parte (la construcción de los ficheros * .so).


actualización También he publicado esta pregunta (anterior) a la RE2 grupo de desarrolladores, sin respuesta hasta ahora (que es un grupo pequeño), y hoy a la (algo más poblada) comp.lang.py grupo [- hilo aquí-] . la esperanza es que la gente de diversos rincones pueden ponerse en contacto entre sí. yo creo que es un experto en la materia puede hacer esto en unas pocas horas durante el 20% de su libre en tiempo-pertenece-google-demasiado porción de tiempo; me ataría durante semanas. ¿hay una herramienta para mudo-presionado C ++ para cualquier sabor de C que Python tiene que ser capaz de conectarse automáticamente? entonces tal vez conseguir un resultado viable puede reducirse a encadenamiento herramienta inteligente.

(queja) por qué es tan difícil? pensar que en 2010 todavía no podemos tener nuestros abundantes piezas de software acaba de hablar el uno al otro. este es un puesto de control de tal manera que cada vez que desee abordar algunas código C a partir de Python siempre hay que Cruft estos bits de enlace. esto requiere mucho trabajo, pero sólo ofrece un módulo de extensión que es específico de la versión del código C y la versión de Python, por lo que envejece rápidamente. (/ diatriba) ¿sería posible ejecutar este tipo de cosas en procesos separados (por ejemplo si tuviera un ejecutable RE2 que puede producir resultados para los datos que viene en sobre, por ejemplo, subprocess/Popen/communicate())? (esto no debería ser una herramienta de línea de comandos pura que requiere la apertura de un proceso cada vez que sea necesario, pero un solo processs que funciona de forma continua, tal vez no existe envolturas de ese tipo de 'demonize' tal código C)

.
¿Fue útil?

Solución

David Reiss ha creado un envoltorio de Python para RE2. No tiene toda la funcionalidad del módulo de regreso de Python, pero es un comienzo. Está disponible aquí:. http://github.com/facebook/pyre2

Otros consejos

Posible sí, no fácil. En cuanto a la re2.h, esto es una biblioteca de C ++ expuesto como una clase. Hay dos formas en las que podría utilizarlo desde Python.

1). Como dice Tuomas, compilarlo como un archivo DLL / SO y utilizar ctypes. Con el fin de utilizarlo de pitón, sin embargo, que se necesita para envolver el objeto y los métodos init en funciones externed estilo c. He hecho esto en el pasado con ctypes por externing funciones que pasan un puntero al objeto alrededor. La función "init" devuelve un puntero nulo en el objeto que se pasa en cada llamada al método siguiente. De hecho muy desordenado.

2.) Envolver en un verdadero módulo de Python. Una vez más las funciones expuestas al pitón tendrían que ser extern "C". Una opción es usar Boost.Python , que facilitaría este trabajo.

SWIG maneja C ++ (a diferencia de ctypes), por lo que puede ser más fácil de utilizar.

Se podría tratar de construir RE2 en su propia DLL / SO y utilizar ctypes para llamar a funciones de esa DLL / así. Es probable que necesite para definir sus propios puntos de entrada en el archivo DLL / así.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top