문제

방금 발견했습니다 http://code.google.com/p/re2, 오랫동안 음성화 된 방법을 사용하는 유망한 도서관 (톰슨 NFA) AWK, Perl 또는 Python의 사용 가능한 엔진보다 더 빠른 크기 순서가 될 수있는 정규 발현 엔진을 구현합니다.

그래서 코드를 다운로드하고 평소를했습니다 sudo make install 물건. 그러나 그 행동은 /usr/local/include/re2/re2.h 내 시스템에. ```.ㅏfile in addition, but then what is it with this.a``확장?

Python (바람직하게는 Python 3.1)에서 RE2를 사용하고 싶습니다. make_unicode_groups.py 배포판에서 (빌드 프로세스 중에 사용될 수 있습니까?). 그러나 그것들은 내 컴퓨터에 배치되지 않았습니다.

Python에서 RE2를 어떻게 사용할 수 있습니까?


업데이트 두 명의 친절한 사람들이 소스에서 DLLS / *. 파일을 구축하려고 시도한 다음 Python 's를 사용할 수 있다고 지적했습니다. ctypes 그것들에 액세스 할 수있는 도서관. 누구든지 유용한 포인터를 줄 수있는 방법을 줄 수 있습니까? 나는 특히 첫 번째 부분 ( *.so 파일 구축)에서 거의 단서가 없습니다.


업데이트 나는 또한이 질문을 (이전)에 게시했습니다. RE2 개발자 그룹, 지금까지 답장없이 (작은 그룹입니다) 오늘날 (다소 더 인구가 많음) comp.lang.py 그룹 - 여기서 스레드 -. 희망은 여러 구석의 사람들이 서로 접촉 할 수 있기를 희망합니다. 내 생각에 숙련 된 사람은 20%의 무관심-구글이 많은 시간 동안 20% 동안 이것을 할 수 있다는 것입니다. 그것은 몇 주 동안 나를 묶을 것입니다. Python이 연결할 수 있어야하는 C의 풍미에 대한 C ++를 자동으로 바꾸는 도구가 있습니까? 그런 다음 실행 가능한 결과를 얻는 것이 영리한 공구 체인으로 줄어들 수 있습니다.

(Rant) 왜 이것이 그렇게 어려운가? 2010 년에 우리는 여전히 풍부한 소프트웨어 조각이 서로 대화 할 수 없다고 생각합니다. 이것은 Python에서 일부 C 코드를 처리 할 때 마다이 링크 비트를 항상 cruft 해야하는 장애물입니다. 이를 위해서는 많은 작업이 필요하지만 C 코드의 버전과 Python 버전에 특정한 확장 모듈 만 전달하므로 빠르게 빠릅니다. (/Rant). 별도의 프로세스로 그러한 물건을 실행할 수 있습니까 (예 : RE2 실행 파일이있는 경우, 예를 들어, 데이터에 대한 결과를 생성 할 수 있습니다. subprocess/Popen/communicate())? (이것은 필요할 때마다 프로세스의 개방이 필요한 순수한 명령 줄 도구가되어서는 안됩니다. 그러나 지속적으로 실행되는 단일 프로세스는 아마도 C 코드를 '악마 화'하는 래퍼가있을 수 있습니다).

도움이 되었습니까?

해결책

David Reiss는 RE2의 파이썬 래퍼를 만들었습니다. Python Re 모듈의 모든 기능이 없지만 시작입니다. 여기에서 사용할 수 있습니다. http://github.com/facebook/pyre2.

다른 팁

가능합니다. 쉬운 아니요. RE2.H를 살펴보면 클래스로 노출 된 C ++ 라이브러리입니다. 파이썬에서 사용할 수있는 두 가지 방법이 있습니다.

1.) Tuomas가 말했듯이 DLL/SO로 컴파일하고 CTYPES를 사용하십시오. 그러나 Python에서 사용하려면 객체 초기와 메소드를 C 스타일의 외부 함수로 랩핑해야합니다. 나는 과거에 주위의 물체에 대한 포인터를 전달하는 기능을 통해 ctypes로 이것을 해냈습니다. "init"함수는 각 후속 메소드 호출에서 전달되는 객체에 대한 공허 포인터를 반환합니다. 정말 지저분합니다.

2.) 진정한 파이썬 모듈로 싸십시오. 다시 Python에 노출 된 이러한 기능은 "C"외관이어야합니다. 하나의 옵션은 사용하는 것입니다 boost.python, 그것은이 작업을 완화시킬 것입니다.

통음 C ++ (CTypes와 달리)를 처리하므로 사용하는 것이 더 간단 할 수 있습니다.

RE2를 자체 DLL/SO로 빌드하고 CTYPES를 사용하여 해당 DLL/SO에서 기능을 호출 할 수 있습니다. DLL/SO에서 자신의 진입 점을 정의해야 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top