提升python问题

时间:2011-03-18 02:26:38

标签: c++ boost boost-python

我正在尝试使用boost的python模块将我的一个类暴露给python。我有一个名为StatusEffect的类,我想将它暴露给python。为此,我在StatusEffect的类定义

之后在StatusEffect.h文件中创建它
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,class std :: allocator&gt; __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()的相应代码正确编译。如果我在Primaries.cpp中取消注释有关CppCLass的代码并使用CppClass,那么一切正常。 python模块声明是否需要与使用它们的源文件相同?如果是这样,有什么方法吗?我希望最终能够将我的类的所有Python包装器放在一个头文件中。

任何人都可以指导我做错了吗?

感谢

1 个答案:

答案 0 :(得分:1)

需要注意的一点是,您的包装器应该位于StatusEffect.cpp中,而不是StatusEffect.h或单独的CPP文件中。但是,它应该没问题,因为一切都应该仍然可以导出。我也会用Python编写一个测试脚本,而不是试图用C测试它。

没有足够的信息来确定您的代码无法正常工作的原因。一些需要考虑的事项:

  1. GetDescription是否有实现?它是纯虚函数吗?
  2. 您的StatusEffect类是否在另一个模块中?如果是,是__dllexport'ed(如果你在Windows上)?
  3. 在你到达boost :: python包装器之前,错误似乎指向了一个问题。您是否尝试过评论您的python内容并尝试直接从您的测试程序调用StatusEffect :: GetDescription?