LINUX.ORG.RU

Расширение питона с помощью С или С++

 , ,


0

4

Встречал мнение, что если нужно, чтобы код можно было использовать из других языков, лучше писать на Си. На сколько сложнее расширять python при помощи С++? Гуглёж подсказал, что если надо только дёргать функции, то можно обойтись extern «C». Но что если у меня будут объекты с конструкторами, деструкторами и исключениями?

Deleted

Си-интерфейс использовать проще (можно обойтись стандартным ctypes). Для Си++ пондобится SWIG.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Для меня станет «ненужен» как только завезут scigo или ещё что, но не завезут.

Deleted
()
Ответ на: комментарий от I-Love-Microsoft

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

Deleted
()

посмотри pybind11. Существенно легче SWIG и Boost, но, вроде как, позволяет свои классы биндить

Sahas ★★★★☆
()

Есть как минимум божественный boost.python. Вроде, были какие то standalone либы которые пытаются сиё повторить.

pon4ik ★★★★★
()
Ответ на: комментарий от Deleted

у С++ нет ABI, поэтому все расширения для любых языков на уровне любимого C.

Будешь пользоваться для этого SWIG или напишешь мелкий интерфейс сам - без разницы.

// псевдокод, практически однотипно для всех
// все требуют __cdecl, многие требуют ещё __stdcall
// myclass::myclass()
__cdecl myclass *myclass_new() {
   return (new myclass);
}
// myclass::~myclass()
__cdecl void myclass_destroy(myclass *me) {
   delete me;
}
////
// int myclass::foo(args)
__cdecl int myclass_foo(myclass *me,args) {
   return me->foo(args);
}
// SWIG это просто делает "на автомате" и плюс заботится про исключения
// но оптимальнее делать самому, опираясь на логику класса
MKuznetsov ★★★★★
()

python

лучше писать на Си

3756

Deleted
()
Ответ на: комментарий от MKuznetsov

у С++ нет ABI

Есть. Но это не относится к вопросу.

tailgunner ★★★★★
()

SWIG — это какая-то жесть от инопланетян. Ни разу не получалось написать на нем более читаемый или менее объёмный код, чем ручное обёртывание плюсовых классов в extern «C» и ручное обертывание получившихся функций через ctypes.

(Я знаю, что изначальная идея SWIG была в том, что один SWIG код оборачивает для всех существующих языков, но в реальном мире это работает разве что для функций с сигнатурой int(int, int).)

https://github.com/google/clif — говорят, лучше, но я не пользовался.

Есть ещё Boost::Python и его С++11-аналоги (типа pybind11), если хочется именно расширять питон.

vzzo ★★★
()
Ответ на: комментарий от vzzo

SWIG — это какая-то жесть от инопланетян. Ни разу не получалось написать на нем более читаемый или менее объёмный код, чем ручное обёртывание плюсовых классов в extern «C» и ручное обертывание получившихся функций через ctypes.

Осталось только выяснить, зачем вы пытаетесь читать код, нагенеренный свигом.

Crocodoom ★★★★★
()
Ответ на: комментарий от Crocodoom

Осталось только выяснить, зачем вы пытаетесь читать код, нагенеренный свигом.

Я имею в виду код, написанный на SWIG, а не сгенерированный им.

vzzo ★★★
()
Ответ на: комментарий от vzzo

А, вот как. Что ж, тогда это очень странно. Не приведете ли пример проблемы, которая делает ваши интерфейсные файлы *.i столь большими и нечитаемыми? Потому что у меня ровно обратный опыт.

И кстати, на SWIG не пишут, поскольку это всё-таки не язык :)

Crocodoom ★★★★★
()
Последнее исправление: Crocodoom (всего исправлений: 1)
Ответ на: комментарий от Crocodoom

Мне кажется, .i-файлы имеют достаточно сложную семантику и большие вкрапления C++, чтобы считать находящееся там кодом.

  • Отдельный парсер, который отстаёт от стандартов на пару лет и не хавает часть хедеров.
  • Вынос мозга с шаблонами.
  • Никакого std::function.
  • Никаких умных указателей.
  • Сложные правила того, как делать %rename при наличии %ignore, пространств имён, вложенных классов и т.п.

Всё это переходит в дефайны в обычных хедерах, в обёртки, либо в typemap/apply в i-файлах.

vzzo ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.