Можно ли использовать re2 из Python?
Вопрос
я только что обнаружил http://code.google.com/p/re2, многообещающая библиотека, использующая давно забытый способ (Томпсон НФА), чтобы реализовать механизм регулярных выражений, который может быть на несколько порядков быстрее, чем доступные механизмы 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?
обновлять два дружелюбных человека отметили, что я мог бы попытаться собрать файлы DLL/*.so из исходных кодов, а затем использовать Python ctypes
библиотека для доступа к ним.может ли кто-нибудь дать полезные советы, как это сделать?я здесь почти ничего не понимаю, особенно в первой части (создание файлов *.so).
обновлять я также разместил этот вопрос (ранее) на группа разработчиков re2, до сих пор без ответа (это небольшая группа), а сегодня (несколько более многочисленная) comp.lang.py группа [—тема здесь—].есть надежда, что люди из разных уголков смогут связаться друг с другом.я предполагаю, что опытный человек может сделать это за несколько часов в течение своего 20%-го интервала времени «ваше свободное время принадлежит тоже Google»;это свяжет меня на несколько недель. Существует ли инструмент для автоматического преобразования C++ в любой вариант C, к которому Python должен иметь возможность подключаться? тогда, возможно, получение жизнеспособного результата можно свести к умной цепочке инструментов.
(разглагольствование) почему это так сложно?думать, что в 2010 году мы все еще не можем позволить нашим обильным программам просто общаться друг с другом.это такое препятствие, что всякий раз, когда вы хотите обратиться к какому-либо коду C из Python, вам всегда приходится собирать эти связывающие биты.это требует много работы, но предоставляет только модуль расширения, специфичный для версии кода C и версии Python, поэтому он быстро устаревает.(/rant) можно ли запускать такие вещи в отдельных процессах (скажем, если бы у меня был исполняемый файл re2, который может выдавать результаты для данных, поступающих, скажем, subprocess/Popen/communicate()
)? (это должен быть не чистый инструмент командной строки, который требует открытия процесса каждый раз, когда это необходимо, а отдельный процесс, который выполняется непрерывно;возможно, существуют оболочки, которые как бы «демонизируют» такой код C).
Решение
Дэвид Рейсс собрал оболочку Python для re2.Он не обладает всей функциональностью модуля re Python, но это только начало.Это доступно здесь: http://github.com/facebook/pyre2.
Другие советы
Возможно да, легко нет.Если посмотреть на re2.h, то это библиотека C++, представленная как класс.Есть два способа использовать его из Python.
1.) Как говорит Туомас, скомпилируйте его как DLL/so и используйте ctypes.Однако, чтобы использовать его из Python, вам нужно будет обернуть инициализацию и методы объекта во внешние функции стиля C.Раньше я делал это с помощью ctypes, используя внешние функции, которые передают указатель на окружающий объект.Функция «init» возвращает пустой указатель на объект, который передается при каждом последующем вызове метода.Действительно очень грязно.
2.) Оберните его в настоящий модуль Python.Опять же, эти функции, доступные для Python, должны быть extern «C».Один из вариантов — использовать Boost.Python, это облегчило бы эту работу.
СВИГ обрабатывает C++ (в отличие от ctypes), поэтому его может быть проще использовать.
Вы можете попытаться встроить re2 в собственную DLL/so и использовать ctypes для вызова функций из этой DLL/so.Вероятно, вам потребуется определить свои собственные точки входа в DLL/so.