Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 27, 2011 21:32:02

Обедающий философ
От:
Зарегистрирован: 2011-05-06
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

boost::python завернуть boost::array

Вопщем стал искать минимальный пример, дабы привести. В итоге таки обнаружил корень зла. Дабы лишний раз не вбивать лишние команды, я сделал компиляцию из питона:

os.system("bjam && cp bin/gcc-4.5.2/debug/model.so .")
Ну и, видимо, ей не нравится, когда файл на ходу подвергается переписыванию. Премного благодарен.

И коли уж речь об этом зашла - как сделать, чтобы бджем компилировал в ту же папку? Ну или как все реальные пацаны делают, чтобы всё было разложено по папкам и в то же время чтобы всё было в досягаемости? А то у меня как-то с папками никогда не складывались отношения.



Офлайн

#2 Авг. 27, 2011 21:42:49

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

boost::python завернуть boost::array

Чтобы все было на нужном месте делается в скрипте для jam делается install



Офлайн

#3 Авг. 27, 2011 23:01:53

Обедающий философ
От:
Зарегистрирован: 2011-05-06
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

boost::python завернуть boost::array

Нашёл решение. http://stackoverflow.com/questions/279237/python-import-a-module-from-a-folder/6098238#6098238 Тепереча, как говорится, и овцы сыты, и кошки серы. То бишь ежели перекомпиляция не требуется, то и файл не перезаписывается, стало быть, ничего не падает.



Офлайн

#4 Окт. 7, 2011 14:41:55

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

boost::python завернуть boost::array

Всетаки пришлось и обычные массивы цеплять.

class Ta
{
public:
float x[5];
};
template <class T,class TR,TR T::*PTR>
boost::python::list VectorGetter(T& self)
{
// return sizeof(TR);
boost::python::list t;
const int ITEMSIZE=sizeof((self.*PTR)[0]);
const int N=sizeof(TR)/ITEMSIZE;
for(int i=0;i<N;++i) t.append((self.*PTR)[i]);
return t;
}
template <class T,class Tr,class TR,TR T::*PTR>
void VectorSetter(T& self,boost::python::object& v)
{
const int ITEMSIZE=sizeof(Tr);
const int N=sizeof(TR)/ITEMSIZE;
for(int i=0;i<N;++i)
(self.*PTR)[i]=extract<Tr>(v[i]);
// (self.*PTR)[i]=extract<float>(v[i]);
}
#define add_vectorf(T,arg) add_property(#arg, &VectorGetter<T,decltype(T().arg),&T::arg>,&VectorSetter<T,float,decltype(T().arg),&T::arg>)
#define add_vectori(T,arg) add_property(#arg, &VectorGetter<T,decltype(T().arg),&T::arg>,&VectorSetter<T,int,decltype(T().arg),&T::arg>)
BOOST_PYTHON_MODULE(cproto)
{
class_<Ta>("Ta")
.add_vectorf(Ta,kI)
;
}
Проблема: не очень понятно как сделать разадресацию типа - поэтому лезут лишние параметры.
extract<float>(v); - проходит
extract<decltype((self.*PTR))>(v); - не проходит



Отредактировано (Окт. 7, 2011 14:46:10)

Офлайн

#5 Дек. 19, 2011 17:14:04

Обедающий философ
От:
Зарегистрирован: 2011-05-06
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

boost::python завернуть boost::array

Добрый вечер ещё раз!

Спешу вам сообщить, что я открыл для себя SWIG. По первым впечатлениям - небо и земля по сравнению с бустом. Вся информация, которая нужна (почти) - содержится на одной странице. http://www.swig.org/Doc1.3/Python.html . Заводится с полоборота (по крайней мере по сравнению с бустом), массивы и всё остальное обёртывает на раз. Правда, STL-ные вектора и пр. ещё не пробовал заворачивать, но в туториале вроде пишут, что и это не проблема. Ежели встречу какие-либо подводные камни - то напишу. Также интересно было бы узнать, по каким параметрам буст питон лучше свига.



Офлайн

#6 Дек. 19, 2011 21:20:05

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

boost::python завернуть boost::array

Обедающий философ
по каким параметрам буст питон лучше свига
см. http://www.boostpro.com/writing/bpl.html
Преимущество boost::python - более прозрачное создание и управление питоновскими объектами из c++.
В сложных случаях очень трудно научить swig делать то что надо (это требует очень глубокого его изучения). Есть под visual studio проблемы c debug версией интерфейса (требует debug версии самого питона). Проблема с векторами в boost::python вызывает у меня удивление - можно было написать как это делать.
swig можно рекомендовать когда есть туча классов или функций с простенькими интерфейсами, Когда надо обеспечить интерфейс не только с python, но и с другими языками.



Офлайн

#7 Дек. 19, 2011 23:21:21

Обедающий философ
От:
Зарегистрирован: 2011-05-06
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

boost::python завернуть boost::array

doza_and
Преимущество boost::python - более прозрачное создание и управление питоновскими объектами из c++.
Вот это не пробовал.

doza_and
В сложных случаях очень трудно научить swig делать то что надо (это требует очень глубокого его изучения).
Можно пример?

doza_and
Проблема с векторами в boost::python вызывает у меня удивление
Ну так у вас же это тоже вызвало проблему. И вы тоже кучу времени положили на её решение (хотя и успешно, в отличие от). А в свиге это в одно действие делается.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version