2012-01-31 8 views
8

Przeczytałem następujące dwa wątki na wrapping C library i C++ library, nie jestem pewien, czy mam go jeszcze. Biblioteka C++, z którą pracuję, używa klasy i szablonu, ale nie w zbyt wyrafinowany sposób. Jakie są problemy lub zastrzeżenia dotyczące zawijania go za pomocą ctypów (poza tym, że można to zrobić w czystym pythonie itp.)?Czy zawijanie biblioteki C++ z ctypami jest złym pomysłem?

PyCXX, Cython i boost :: python to trzy inne wybory, o których wspominano, czy istnieje konsensus, który z nich jest bardziej odpowiedni dla C++?

Dzięki

Oliver

Odpowiedz

9

Dla C++ biblioteki mają być dostępne z poziomu Pythona musi używać nazw eksportowych C, co w zasadzie oznacza, że ​​funkcja o nazwie foo będą dostępne z ctypes jak foo.

ten można osiągnąć tylko załączając publiczny interfejs z export C {}, co z kolei wykluczy przeciążania funkcji i szablonów nim (tylko publiczny interfejs biblioteki być owinięty jest istotne, wewnętrzne mechanizmy nie są i mogą wykorzystywać dowolne funkcje C++, które lubią).

Powodem jest to, że kompilatory C++ używają mechanizmu nazwanego mangling nazwy do generowania niepowtarzalnych nazw dla przeciążonych lub szablonowych symboli. Podczas gdy ctypes nadal znajdzie funkcję pod warunkiem, że znasz jej zniekształconą nazwę, schemat manewrowania zależy od używanego kompilatora/linkera i nie można na nim polegać. W skrócie: nie używaj ctypes do owijania bibliotek korzystających z funkcji C++ w ich publicznym interfejsie.

Cython przyjmuje inne podejście. Pomaga w budowaniu modułu rozszerzenia C, który łączy się z oryginalną biblioteką. Dlatego łączenie z biblioteką C++ odbywa się za pomocą zwykłego mechanizmu C++, unikając w ten sposób wspomnianego problemu. Problem z Cythonem polega na tym, że biblioteki rozszerzeń C muszą być rekompilowane dla każdej platformy, ale w każdym razie dotyczy to również biblioteki C++, która ma być opakowana.

Osobiście, powiedziałbym, że w większości przypadków czas na uruchomienie Cython to czas, który jest dobrze wydany i ostatecznie spłaci się w porównaniu do ctypów (z wyjątkiem naprawdę prostych interfejsów Cish).

Nie mam żadnego doświadczenia z boost.python, więc nie mogę tego komentować (jednak nie mam wrażenia, że ​​jest bardzo popularny).

+0

Dzięki za zaproszenie Cythona jako opcji! Wybrałem go do pakowania C api i miałem pozytywne doświadczenie - to jest jak pisanie Pythona z kilkoma liniami C i daje dużo kontroli. Jedną z rzeczy, z którymi miałem problemy było prawidłowe wykonanie procesu kompilacji - w końcu przygotowałem wstępne kompilowanie plików Cython przed utworzeniem dystrybucji źródłowej. Jeśli ktokolwiek ma podobne problemy, szczegółowo wyjaśniłem, w jaki sposób zapakowałem moje C api w Cython tutaj, łącznie z procesem kompilacji: http://martinsosic.com/development/2016/02/08/wrapping-c-library-as-python -module.html – Martinsos

14

W obronie boost::python, biorąc pod uwagę odpowiedź Aleksandra na ctypes:

doładowania pyton przewiduje się bardzo „C++” interfejs między C++ i kod Pythona - nawet robić rzeczy, jak dozwolony podklasy Pythona z C++ klas przesłonić metody wirtualne jest stosunkowo proste. Oto lista dobrych funkcji:

  • Umożliwiają nadpisanie wirtualnych metod klas C++ przez podklasy Pythona.
  • Most między std::vector<>, std::map<> przypadkach i list Python i słowników (z wykorzystaniem vector_indexing_suite i map_indexing_suite)
  • Automatyczne dzielenie liczby odniesienia w inteligentne kursory (boost::shared_ptr itp) z liczbą odniesienia python (i można rozszerzyć na dowolny inteligentnego wskaźnika).
  • Drobnoziarnista kontrola własności podczas przekazywania argumentów i zwracania wartości z funkcji.

Zasadniczo, jeśli masz projekt, w którym chcesz odsłonić interfejs C++ w sposób zgodny z językiem, wówczas boost :: python to prawdopodobnie najlepszy sposób na zrobienie tego.

Jedynymi wadami są zwiększony czas kompilacji (zwiększanie :: python powoduje intensywne korzystanie z szablonów), a czasami nieprzejrzyste komunikaty o błędach, jeśli nie wszystko jest w porządku.

+2

Innym problemem jest silne sprzężenie wersji boost i python. Na przykład, jeśli uaktualnisz wersję python, będziesz musiał przebudować wersję boost – user1827356

Powiązane problemy