2011-09-07 5 views
0

저는 파이썬 인터페이스를 C++ 라이브러리에 작성하고 있으며 라이브러리의 올바른 디자인에 대해 궁금합니다.많은 기능을 가진 python-C++ 인터페이스 코드의 파이썬 구조는 무엇입니까?

파이썬에 전달 된 모든 메소드를 정적으로 선언해야한다는 것을 알게되었습니다. 내가 올바르게 이해한다면 이것은 모든 기능이 기본적으로 동일한 .cpp 파일에 정의되어야한다는 것을 의미합니다. 필자의 인터페이스는 많은 기능을 가지고 있으므로 매우 빨리 추악 해집니다.

이 문제를 해결하기위한 표준 방법은 무엇입니까? 내가 생각할 수있는 가능성 :

  • 그것에 대해 걱정
  • 는 각 그룹에 대한 .CPP 쓰기
  • 하나 이상의 라이브러리로 컴파일 한 looong .cpp 파일 (.so를 파일)을 사용하지 않는

주요 정의 CPP 파일합니다 (PyMethodDef와 하나)의 본문에 .CPP 기능과 사용법 #include는 둘 다 매우 추한 것

답변

1

파이썬에 전달 된 모든 메소드가 반드시 정적이어야한다고 (어려운 방법) 발견했습니다. 내가 올바르게 이해한다면 이것은 모든 기능이 기본적으로 동일한 .cpp 파일에 정의되어야 함을 의미합니다. 내 인터페이스에는 많은 기능이 있으므로 아주 빨리 못 생깁니다.

어디에서 알 수 있습니까? 그것은 사실이 아닙니다. 키워드 static은 C++에서 두 가지 다른 것을 의미합니다. class-static은 class-scoped 함수가 (보통 함수처럼) 객체의 인스턴스없이 호출된다는 것을 의미합니다. 정적 링크가 있습니다. 즉, 함수가 전역 오프셋 테이블에 추가되지 않고 번역 단위 (CPP 파일) 외부에서 함수를 찾는 데 어려움을 겪을 수 있습니다.

나는 Boost.Python을보고 싶습니다. 그들은 발생할 수있는 많은 문제를 해결했으며 C++과 Python이 서로 이야기하는 것을 매우 쉽게 만들어줍니다.

0

왜 파이썬에서 호출하는 모든 함수가 정적이 이어야한다고 말합니까? 그 이유는 보통 (이름 공간 등은 extern "C"으로 인해 때문에 무시 됨)을 피하기 위해서입니다. 그러나 함수가 정적이든간에 인지 여부는 아무런 결과가 아닙니다.

C++의 라이브러리를 인터페이스 할 때 기능은 단지 작은 래퍼되기 때문에, 내 경험, 그것은 큰 문제가, 그것은 정적 확인하고, 하나의 번역 단위에서 모든 기능을 넣어 일반적으로 을 아니다

어떤 실제적인 C++, 을 호출하고 보통 일종의 서술자 파일에서 자동으로 생성됩니다. 당신은 반드시 필요한 상용구를 직접 작성하지 않을 것입니다.

관련 문제