Подтвердить что ты не робот

Можно ли использовать re2 из Python?

я только что обнаружил http://code.google.com/p/re2, многообещающую библиотеку, которая использует заброшенный путь (Thompson NFA) для реализации механизма регулярных выражений, который может быть порядком величин быстрее, чем доступные двигатели awk, Perl или Python.

поэтому я загрузил код и сделал обычную вещь sudo make install. однако это действие, по-видимому, сделало не что иное, как добавление /usr/local/include/re2/re2.h в мою систему. казалось, что существует некоторое расширение `.` file in addition, but then what is it with this.a``?

Я хотел бы использовать re2 из Python (предпочтительнее Python 3.1) и был рад видеть файлы типа make_unicode_groups.py в дистрибутиве (возможно, просто используется во время процесса сборки?). однако они не были развернуты на моей машине.

как я могу использовать re2 из Python?


update два дружелюбных человека указали, что я могу попытаться создать файлы DLL/*.so из источников, а затем использовать библиотеку Pythons ctypes для доступа к ним. может ли кто-нибудь дать полезные указания, как это сделать? im в значительной степени clueless здесь, особенно с первой частью (создание файлов *.so).


update Я также разместил этот вопрос (ранее) в группе разработчиков re2, без ответа до сих пор ( это небольшая группа), а сегодня (несколько более густонаселенной) comp.lang.py group [- thread here-]. надежда состоит в том, что люди из разных уголков могут контактировать друг с другом. я думаю, что опытный человек может сделать это через несколько часов во время своего 20% свободного времени-времени-google-too timlice; это завяжет меня в течение нескольких недель. есть ли инструмент для автоматического отключения С++ для любого стиля C, который должен поддерживать Python?, тогда, возможно, получение жизнеспособного результата может быть уменьшено до умной цепочки инструментов.

(rant), почему это так сложно? думать, что в 2010 году мы все еще не можем иметь наши многочисленные программные продукты, которые просто говорят друг с другом. это такой дорожный блок, что всякий раз, когда вы хотите обратиться к некоторому C-коду с Python, вы должны всегда прокручивать эти связующие биты. это требует большой работы, но только предоставляет модуль расширения, который специфичен для версии кода C и версии Python, поэтому он стареет быстро. (/rant) можно было бы запускать такие вещи в (например, если у меня был исполняемый файл re2, который может создавать результаты для данных, которые входят, например, subprocess/Popen/communicate())? (это не должно быть чистым средством командной строки, которое требует открытия процесса каждый раз, когда это необходимо, но отдельные процессы, которые выполняются непрерывно, возможно, существуют обертки, которые "демонизируют такой C-код".

4b9b3361

Ответ 1

Дэвид Рейсс собрал оболочку Python для re2. Он не обладает всеми функциональными возможностями модуля Python re, но он запускается. Он доступен здесь: http://github.com/facebook/pyre2.

Ответ 2

Возможно, да, нет. Глядя на re2.h, это библиотека С++, представленная как класс. Есть два способа использовать его с Python.

1.) Как говорит Туомас, скомпилируйте его как DLL/так и используйте ctypes. Однако, чтобы использовать его из python, вам нужно будет обернуть объект init и методы в функции внешнего стиля c. Я делал это в прошлом с помощью ctypes с помощью внешних функций, которые передают указатель на объект вокруг. Функция "init" возвращает указатель void на объект, который передается при каждом последующем вызове метода. Очень грязно.

2.) Оберните его в настоящий модуль python. Опять же, функции, подверженные python, должны быть extern "C". Один из вариантов - использовать Boost.Python, что облегчит эту работу.

Ответ 3

SWIG обрабатывает С++ (в отличие от ctypes), поэтому может быть проще использовать его.

Ответ 4

Вы можете попытаться создать re2 в свою собственную DLL/так и использовать ctypes для вызова функций из этой DLL/so. Вероятно, вам нужно будет определить свои собственные точки входа в DLL/так.