Pergunta

acabei de descobrir http://code.google.com/p/re2, uma biblioteca promissora que usa uma forma há muito negligenciada (Thompson NFA) para implementar um mecanismo de expressão regular que pode ser muito mais rápido do que os mecanismos disponíveis de awk, Perl ou Python.

então baixei o código e fiz o de costume sudo make install coisa.no entanto, essa ação aparentemente fez pouco mais do que adicionar /usr/local/include/re2/re2.h para o meu sistema.parecia haver algum ```.afile in addition, but then what is it with this.a`` extensão?

eu gostaria de usar re2 do Python (de preferência Python 3.1) e fiquei animado para ver arquivos como make_unicode_groups.py na distribuição (talvez usado apenas durante o processo de construção?).aqueles, entretanto, não foram implantados em minha máquina.

como posso usar re2 do Python?


atualizar duas pessoas amigáveis ​​​​apontaram que eu poderia tentar construir arquivos DLLs / *.so a partir das fontes e depois usar Python ctypes biblioteca para acessá-los.alguém pode dar dicas úteis sobre como fazer exatamente isso?estou praticamente sem noção aqui, especialmente com a primeira parte (construindo os arquivos *.so).


atualizar eu também postei esta pergunta (anteriormente) no grupo de desenvolvedores re2, sem resposta até agora (é um grupo pequeno), e hoje ao (um pouco mais populoso) comp.lang.py grupo [—tópico aqui—].a esperança é que pessoas de vários cantos possam entrar em contato umas com as outras.meu palpite é que uma pessoa habilidosa pode fazer isso em algumas horas durante o intervalo de tempo de 20% do seu tempo livre pertence ao Google;isso me amarraria por semanas. existe uma ferramenta para simplificar automaticamente o C++ para qualquer tipo de C que o Python precisa para ser capaz de se conectar? então talvez a obtenção de um resultado viável possa ser reduzida a um encadeamento inteligente de ferramentas.

(desabafo) por que isso é tão difícil?pensar que em 2010 ainda não podemos permitir que nossos abundantes softwares apenas conversem entre si.isso é um obstáculo tão grande que sempre que você quiser abordar algum código C do Python, você deve sempre extrair esses bits de ligação.isso requer muito trabalho, mas fornece apenas um módulo de extensão específico para a versão do código C e a versão do Python, portanto, envelhece rapidamente.(/rant) seria possível executar essas coisas em processos separados (digamos, se eu tivesse um executável re2 que pudesse produzir resultados para dados que chegam, digamos, subprocess/Popen/communicate())? (esta não deve ser uma ferramenta pura de linha de comando que exige a abertura de um processo sempre que necessário, mas um único processo que é executado continuamente;talvez existam wrappers que “demonizam” esse código C).

Foi útil?

Solução

David Reiss montou um wrapper Python para re2.Ele não possui todas as funcionalidades do módulo re do Python, mas é um começo.Está disponível aqui: http://github.com/facebook/pyre2.

Outras dicas

Possível sim, fácil não.Olhando para re2.h, esta é uma biblioteca C++ exposta como uma classe.Existem duas maneiras de usá-lo em Python.

1.) Como diz Tuomas, compile-o como uma DLL/so e use ctypes.Para usá-lo em python, você precisaria agrupar o objeto init e os métodos em funções externas de estilo c.Já fiz isso no passado com ctypes externando funções que passam um ponteiro para o objeto ao redor.A função “init” retorna um ponteiro nulo para o objeto que é passado em cada chamada de método subsequente.Realmente muito bagunçado.

2.) Envolva-o em um módulo python verdadeiro.Novamente, essas funções expostas ao python precisariam ser "C" externo.Uma opção é usar Boost.Python, isso facilitaria esse trabalho.

GOLE lida com C++ (diferentemente de ctypes), portanto pode ser mais simples usá-lo.

Você poderia tentar construir re2 em seu próprio DLL/so e usar ctypes para chamar funções desse DLL/so.Você provavelmente precisará definir seus próprios pontos de entrada na DLL/so.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top