Я могу использовать функции C++ при расширении Python?

В руководстве Python говорится, что можно создать модули для Python и в C и в C++. Можно ли использовать в своих интересах вещи как классы и шаблоны при использовании C++? Разве это не создало бы несовместимости с остальной частью библиотек и с интерпретатором?

5
задан Amro 20 August 2012 в 23:59
поделиться

4 ответа

Не имеет значения, реализована ли ваша реализация функций перехвата на C или на C ++. Фактически, я уже видел некоторые расширения Python, которые активно используют шаблоны C ++ и даже библиотеку Boost. Нет проблем. : -)

8
ответ дан 18 December 2019 в 13:17
поделиться

У разработчиков Boost есть хороший автоматизированный способ обертывания кода C ++ для использования Python.

Он называется: Boost.Python

Он имеет дело с некоторыми конструкциями C ++ лучше, чем SWIG, особенно метапрограммирование шаблонов.

3
ответ дан 18 December 2019 в 13:17
поделиться

Что вас интересует, так это программа под названием SWIG . Он будет генерировать оболочки и интерфейсы Python для кода C ++. Я использую его с шаблонами, наследованием, пространствами имен и т. Д., И он хорошо работает.

2
ответ дан 18 December 2019 в 13:17
поделиться

Вы должны уметь использовать все возможности языка C ++. В Расширяющей документации Python (2.6.2) говорится, что вы можете использовать C ++, но упоминаются следующие предостережения:

Можно написать расширение модули на C ++. Некоторые ограничения применять. Если основная программа (Python интерпретатор) компилируется и связывается компилятор C, глобальный или статический объекты с конструкторами не могут быть используемый. Это не проблема, если основная программа связана с C ++ компилятор. Функции, которые будут вызывается интерпретатором Python (в в частности, инициализация модуля functions) должны быть объявлены с использованием внешний "C". Нет необходимости вложите файлы заголовков Python в extern "C" {...} - они используют эту форму уже, если символ __cplusplus определены (все последние компиляторы C ++ определите этот символ).

Первое ограничение, «нельзя использовать глобальные или статические объекты с конструкторами», связано с тем, как большинство компиляторов C ++ инициализируют объекты с этим типом продолжительности хранения. Например, рассмотрим следующий код:

class Foo { Foo() { } };

static Foo f;

int main(int argc, char** argv) {}

Компилятор должен выдать специальный код, чтобы конструктор 'Foo' вызывался для 'f' перед выполнением main. Если у вас есть объекты со статической продолжительностью хранения в вашем расширении Python и , интерпретатор Python не скомпилирован и не связан для C ++, то этот специальный код инициализации не будет создан.

Второе ограничение: «Функции, которые будет вызываться интерпретатором Python (в частности, функции инициализации модуля) должны быть объявлены с использованием extern "C" ", имеет отношение к изменению имени C ++. Большинство компиляторов C ++ искажают свои имена, чтобы они могли использовать те же компоновщики, что и для цепочек инструментов C. Например, у вас есть:

void a_function_python_calls(void* foo);

компилятор C ++ может преобразовывать ссылки на имя 'a_function_python_calls' во что-то вроде 'a_function_python_calls @ 1vga '. В этом случае вы можете получить неразрешенное внешнее сообщение при попытке связи с библиотекой Python.

1
ответ дан 18 December 2019 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: