Действительно ли возможно использовать re2 из Python?

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

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

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

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


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


обновление я также отправил этот вопрос (ранее) группе re2 разработчиков без ответа до настоящего времени (это - небольшая группа), и сегодня (несколько более густонаселенной) comp.lang.py группе [— потоку здесь —]. надежда состоит в том, что люди от различных углов могут связаться друг с другом. мое предположение является квалифицированным человеком, может сделать это через несколько часов во время их 20% your-free-time-belongs-google-too интервал; это связывало бы меня в течение многих недель. существует ли инструмент к автоматически немому вниз C++ к любой разновидности C, который Python должен смочь соединить? затем, возможно, получение жизнеспособного результата может быть уменьшено до умного объединения в цепочку инструмента.

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

22
задан ergosys 30 December 2011 в 04:48
поделиться

4 ответа

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

15
ответ дан 29 November 2019 в 05:35
поделиться

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

0
ответ дан 29 November 2019 в 05:35
поделиться

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

3
ответ дан 29 November 2019 в 05:35
поделиться

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

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

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

5
ответ дан 29 November 2019 в 05:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: