Найти - Пользователи
Полная версия: Код на С++ в программе на Питоне
Начало » Python для экспертов » Код на С++ в программе на Питоне
1 2
Immelmann
Есть несколько крупных математический функций написанных на С++. Переписывать на Питоне нет желания и времени. Можно ли (и тогда как) вставить их в прогу на Питоне??Чтобы конкретнее - есть файл math.cpp, в нем допустим 1 функция которой передается значение X она выдает (впринципе в какой форме скажете в такой и выдаст) значение Y. Суть в том что попросили на Питоне доделать прогу начатую на С++ :( или никак??
alafin
Можно воспользоваться генераторами оболочек т.е. созданием python-библиотек из C/C++ библиотек. Вот некоторые ссылки:
SWIG: http://www.swig.org/
SIP: http://www.riverbankcomputing.co.uk/sip/
там и дока есть.
Александр
В книге М.Лутца “Программирование на Python” тоже неплохо рассказано о SWIG

А у меня вопрос такой:
У меня есть класс на С++, примерно такой:
#include <vector>
#include <cstring>
#include <new>

class Table {
/* */
char* name;
public:
std::vector<std::vector<char*> >* t;

Table(char* n)
{
name=n;
t=new std::vector<std::vector<char*> >(1),(1);
(*t)=new char;
strcpy((*t),“My_string!”);
}

~Table()
{
delete (*t);
delete t;
}
};

С помощью того же SWIG я скомпиллил либу и модуль для Питона

На С++ классом можно пользоваться так:
#include “tclass.h”
#include <stdio.h>

main()
{
Table tbl(“dbf”);
printf(“%s\n”, (*tbl.t));
return 0;
}

А как на Питоне? У него ж указателей нет!
Я пишу так:
from tclass import Table

tbl=Table(“My_string!”)
print tbl.t # Это не то, так как Питон воспринимает этот не разыменованый указатель как строку
slav0nic
посмотри для примера http://slav0nic.xss.ru/projects/procfs.tar.gz
со времён “книги Лутца” python API вродже как поменяль (помню долго парился не понимая чего не компилится=) )

думаю простой срр легко “портировать”, просто сделать каркас и ретурны “сделать в питон” и всё
Александр
slav0nic
посмотри для примера http://slav0nic.xss.ru/projects/procfs.tar.gz
со времён “книги Лутца” python API вродже как поменяль (помню долго парился не понимая чего не компилится=) )

думаю простой срр легко “портировать”, просто сделать каркас и ретурны “сделать в питон” и всё
Спасибо
Александр
slav0nic
посмотри для примера http://slav0nic.xss.ru/projects/procfs.tar.gz
со времён “книги Лутца” python API вродже как поменяль (помню долго парился не понимая чего не компилится=) )

думаю простой срр легко “портировать”, просто сделать каркас и ретурны “сделать в питон” и всё
Порылся я в энтих исходниках и наваял примерно такое:
class MyClass {
/* */
public:
/* */
PyObject* Room(PyObject* self,PyObject* args);
};

А вот код функции:
PyObject* MyClass::Room(PyObject* setf,PyObject* args)
{
int r, c;
PyArg_Parse(args, “(ii)”, &r, &c);
switch (type) {
case ‘C’:
return Py_BuildValue(“s”,Table);
break;
case ‘N’:
return Py_BuildValue(“i”,atoi(Table));
case ‘F’:
return Py_BuildValue(“f”,atof(Table));
break;
default:
return Py_BuildValue(“s”,“Unknown type!”);
break;
}
}

Собирается успешно. (SWIG)
Из под Пайтона работают все функции класса, кроме описаной выше, при вызове которой рушится программа

Я так полагаю, что это из-зи отсутсвия таблицы регистрации (PyMethodDef) и инициализации модуля (PyInintModule())
Но где мне их прописывать (имеется ввиду в классе)?

Или ошибка в чем другом?

P.S.: если объявляю в классе static PyObject* Room(PyObject* self,PyObject* args); то ругань при компиляции огромная
koder
Александр
Собирается успешно. (SWIG)
Из под Пайтона работают все функции класса, кроме описаной выше, при вызове которой рушится программа

Я так полагаю, что это из-зи отсутсвия таблицы регистрации (PyMethodDef) и инициализации модуля (PyInintModule())
Но где мне их прописывать (имеется ввиду в классе)?

Или ошибка в чем другом?

P.S.: если объявляю в классе static PyObject* Room(PyObject* self,PyObject* args); то ругань при компиляции огромная
1)Ругань при компиляции наверно потому что type,Table ето переменные объявленные внутри класса.
(может кон. они и global но по прив. коду етого не видно)
2)Если-бы не было таблиц регистрации то ты бы даже не смог ее вызвать питон бы тебе сказал AttributeError
Вообще если есть студия то можно ето отладить и все увидеть. Или выложи где-нить все исходники целиком
а то так сложно понять(мне по крайней мере).
3)Таблицы инициализации членов класса описываются не внутри класса(это невозможно) а на уровне модуля там же где и таблица ф-ций модуля. Вообще обязательно прочитай официальную докуметацию питона секцию Extending and Embedding там все замечатьльно написано можно даже куски кода потырить
4)По поводу swig нужно еще кое-что добавить - н генерит СИЛЬНО не оптимальные обертки посмотри ради
интереса что он понаваял. Там сначала питоновская прослойка(монстроидная) потом сишная. В общем
накладные расходы на вызов пустой ф-ции обернутой swig > в 20 раз больше чем обернутой руками.
5)Если с плюсами все впорядке(шаблоны) то идеальный вариант - boost.python. Генерит замечательные обертки причем там есть модуль который не хуже swig - c пом. gccxml на автомате сам все делает.
Но к етому он позволяет добратся до самого низкого уровня, если нужно.
Александр
koder
Или выложи где-нить все исходники целиком
а то так сложно понять(мне по крайней мере)
Куда можно выложить?
Могу, конечно, и в форум, но длинноватые исходники
Александр
koder
1)Ругань при компиляции наверно потому что type,Table ето переменные объявленные внутри класса.
(может кон. они и global но по прив. коду етого не видно)
Table объявлена внутри класса и работает успешно. Я это все сначала на С++ проверял, все работает
А вот ретурн в Пайтон мне бы нужно сделать
koder
Александр
Куда можно выложить?
Могу, конечно, и в форум, но длинноватые исходники
Попробуй на рапиду rapidshare.de и кинь ссылку
или вышли мне на мыло koder_dot_mail_at_gmail_dot_com
(не вышли случайно исполняемый файл а то жмыло порежет)
только я раньше завтра ничего не обещаю :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB