Вопрос

я только что обнаружил 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top