Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 15, 2006 23:52:10

Immelmann
От:
Зарегистрирован: 2006-04-15
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Код на С++ в программе на Питоне

Есть несколько крупных математический функций написанных на С++. Переписывать на Питоне нет желания и времени. Можно ли (и тогда как) вставить их в прогу на Питоне??Чтобы конкретнее - есть файл math.cpp, в нем допустим 1 функция которой передается значение X она выдает (впринципе в какой форме скажете в такой и выдаст) значение Y. Суть в том что попросили на Питоне доделать прогу начатую на С++ :( или никак??



Офлайн

#2 Апрель 16, 2006 12:16:57

alafin
Root
От: Киев, Украина
Зарегистрирован: 2006-04-06
Сообщения: 756
Репутация: +  3  -
Профиль   Отправить e-mail  

Код на С++ в программе на Питоне

Можно воспользоваться генераторами оболочек т.е. созданием python-библиотек из C/C++ библиотек. Вот некоторые ссылки:
SWIG: http://www.swig.org/
SIP: http://www.riverbankcomputing.co.uk/sip/
там и дока есть.



Офлайн

#3 Апрель 19, 2006 10:07:53

Александр
От:
Зарегистрирован: 2006-04-14
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Код на С++ в программе на Питоне

В книге М.Лутца “Программирование на 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 # Это не то, так как Питон воспринимает этот не разыменованый указатель как строку



Отредактировано (Апрель 19, 2006 10:13:01)

Офлайн

#4 Май 15, 2006 00:52:33

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2250
Репутация: +  40  -
Профиль   Отправить e-mail  

Код на С++ в программе на Питоне

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

думаю простой срр легко “портировать”, просто сделать каркас и ретурны “сделать в питон” и всё

Офлайн

#5 Май 15, 2006 16:55:31

Александр
От:
Зарегистрирован: 2006-04-14
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Код на С++ в программе на Питоне

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

думаю простой срр легко “портировать”, просто сделать каркас и ретурны “сделать в питон” и всё
Спасибо



Офлайн

#6 Окт. 5, 2006 00:30:45

Александр
От:
Зарегистрирован: 2006-04-14
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Код на С++ в программе на Питоне

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); то ругань при компиляции огромная



Офлайн

#7 Окт. 5, 2006 10:47:46

koder
От:
Зарегистрирован: 2006-09-29
Сообщения: 95
Репутация: +  0  -
Профиль   Отправить e-mail  

Код на С++ в программе на Питоне

Александр
Собирается успешно. (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 на автомате сам все делает.
Но к етому он позволяет добратся до самого низкого уровня, если нужно.



Отредактировано (Окт. 5, 2006 11:40:59)

Офлайн

#8 Окт. 5, 2006 12:06:21

Александр
От:
Зарегистрирован: 2006-04-14
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Код на С++ в программе на Питоне

koder
Или выложи где-нить все исходники целиком
а то так сложно понять(мне по крайней мере)
Куда можно выложить?
Могу, конечно, и в форум, но длинноватые исходники



Офлайн

#9 Окт. 5, 2006 12:18:58

Александр
От:
Зарегистрирован: 2006-04-14
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Код на С++ в программе на Питоне

koder
1)Ругань при компиляции наверно потому что type,Table ето переменные объявленные внутри класса.
(может кон. они и global но по прив. коду етого не видно)
Table объявлена внутри класса и работает успешно. Я это все сначала на С++ проверял, все работает
А вот ретурн в Пайтон мне бы нужно сделать



Офлайн

#10 Окт. 5, 2006 12:18:59

koder
От:
Зарегистрирован: 2006-09-29
Сообщения: 95
Репутация: +  0  -
Профиль   Отправить e-mail  

Код на С++ в программе на Питоне

Александр
Куда можно выложить?
Могу, конечно, и в форум, но длинноватые исходники
Попробуй на рапиду rapidshare.de и кинь ссылку
или вышли мне на мыло koder_dot_mail_at_gmail_dot_com
(не вышли случайно исполняемый файл а то жмыло порежет)
только я раньше завтра ничего не обещаю :)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version