вопрос о питоне - PullRequest
       7

вопрос о питоне

0 голосов
/ 18 марта 2011

Я пытаюсь представить один из моих классов на python, используя модуль python boost.У меня есть класс с именем StatusEffect, который я хотел бы представить в Python.Для этого я создаю это в файле StatusEffect.h после определения класса StatusEffect

BOOST_PYTHON_MODULE(StatusEffect)
{
    boost::python::class_<StatusEffect>("StatusEffect")
        .def("GetPriority", &StatusEffect::GetPriority)
        .def("GetDescription", &StatusEffect::GetDescription)
        .def("GetName", &StatusEffect::GetName);
}

Я хочу использовать его внутри python из функции, объявленной внутри заголовка следующим образом:

Primaries.h

#include <boost\python.hpp>
#include <StatusEffects\StatusEffect.h>
#include "ScriptDeclarations.h";
extern void Test();

и в Primaries.cpp

#include "Primaries.h"
class StatusEffect;
using namespace boost::python;

class CppClass {
public:
  int getNum() {
    return 7;
  }
};

        BOOST_PYTHON_MODULE(CppMod) {
  class_<CppClass>("CppClass")
    .def("getNum",&CppClass::getNum);
}
void Test()
{
    CppClass mClass;
    try 
    {
    PyImport_AppendInittab("CppMod", &initCppMod);
    PyImport_AppendInittab("StatusEffect", &initStatusEffect);
    Py_Initialize();

    object main_module((
      handle<>(borrowed(PyImport_AddModule("__main__")))));

    object main_namespace = main_module.attr("__dict__");

    StatusEffect effect("Haste");
    main_namespace["eff"] = ptr(&effect);
    handle<> ignored((PyRun_String("print eff.GetName()\n",
                                    Py_file_input,
                                    main_namespace.ptr(),
                                    main_namespace.ptr() ) ));

    /*main_namespace["CppClass"] = class_<CppClass>("CppClass")
                               .def("getNum",&CppClass::getNum);
    main_namespace["cpp"] = ptr(&mClass);
    handle<> ignored(( PyRun_String("print cpp.getNum()\n",
                                     Py_file_input,
                                     main_namespace.ptr(),
                                     main_namespace.ptr() ) ));*/

  } 
  catch( error_already_set ) 
  {
    PyErr_Print();
  }
}

однако, когда я делаю это, я получаю следующую ошибку:

Ошибка 16ошибка LNK2001: неразрешенный внешний символ "public: class std :: basic_string, класс std :: allocator> __thiscall StatusEffect :: GetDescription (void)" (? GetDescription @ StatusEffect @@ QAE? AV? $ basic_string @ DU? $ char_traits @ D@ std @@ V? $ allocator @ D @ 2 @@ std @@ XZ) C: \ KHMP \ Game_Cpp \ KHMPCpp \ KHMPCpp \ GameCharacter.obj KHMPCpp

Я совершенно уверен, что это связано с моимОбъявление Python, как когда я удаляю это, и соответствующий код из Test (), он компилируется правильно.Если я раскомментирую код CppCLass в Primaries.cpp и использую CppClass, все будет работать нормально.Должны ли объявления модуля Python находиться в том же исходном файле, где они используются?Если так, есть ли способ обойти это?В конечном итоге я бы хотел поместить все обертки Python для моих классов в один заголовочный файл.

Кто-нибудь может подсказать мне, что я делаю неправильно?

спасибо

1 Ответ

1 голос
/ 18 марта 2011

Следует отметить, что ваша обертка должна находиться в вашем StatusEffect.cpp, а не в StatusEffect.h или в отдельном файле CPP.Тем не менее, все должно быть в порядке, так как все должно экспортироваться.Я также написал бы тестовый скрипт на Python, вместо того, чтобы пытаться протестировать его с C.

Недостаточно информации, чтобы выяснить, почему ваш код не работает.Некоторые вещи для рассмотрения:

  1. Есть ли в GetDescription реализация?Это чисто виртуальная функция?
  2. Ваш класс StatusEffect находится в другом модуле?Если да, то __dllexport'ed (если вы работаете в Windows)?

Ошибка, похоже, указывает на проблему, прежде чем вы перейдете к оболочке boost :: python.Вы пытались закомментировать ваш материал на Python и просто пытаться вызвать StatusEffect :: GetDescription прямо из вашей тестовой программы?

...