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).
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