一、問題:
現(xiàn)在有一個C++類庫Mythma.dll,需要Python用戶也可以調(diào)用這些服務(wù),所以需要用封裝其為Python擴(kuò)展模塊Mythma.pyd。
現(xiàn)在有可執(zhí)行程序PythonConsole.exe,依賴Mythma.dll模塊,希望PythonConsole.exe可以調(diào)用Python腳本,所以PythonConsole.exe中需要嵌入Python解析器。
此時,PythonConsole.exe既可以直接訪問Mythma.dll,又可以通過Python腳本訪問Mythma.dll。關(guān)系圖如下:
二、實(shí)現(xiàn)
1、假設(shè)Mythma.dll中的類為CHelloWorld
class MythmaAPI CHelloWorld

{
public:
CHelloWorld(void);
~CHelloWorld(void);

void SetId(int nId)
{ m_Id = nId;}
int GetId() const
{ return m_Id; }
private:
int m_Id;
};
2、用Boost.Python將C++模塊封裝,使得Python腳本可以調(diào)用C++的功能
如:
#include "HelloWorld.h"
#include <boost/python.hpp>
using namespace boost::python;
BOOST_PYTHON_MODULE(MythmaPy)

{
class_<CHelloWorld>("CHelloWorld")
.def("SetId", &CHelloWorld::SetId)
.def("GetId", &CHelloWorld::GetId)
;
}
此時,可以用Python腳本訪問Mythma.dll中的類,axxscript.py文件中的內(nèi)容為:
#import MythmaPy
from MythmaPy import *
world = CHelloWorld()
world.SetId(100)
print world.GetId()
3、在C++程序里內(nèi)嵌Python解析器,使得C++可以調(diào)用Python腳本
建立一個控制臺程序PythonConsole.exe,用來嵌入Python解析器
int main(int argc, char **argv)

{
// Initialize the interpreter
Py_Initialize();
if (python::handle_exception(exec_mythma))
{
if (PyErr_Occurred())
{
BOOST_ERROR("Python Error detected");
PyErr_Print();
}
else
{
BOOST_ERROR("A C++ exception was thrown for which "
"there was no exception translator registered.");
}
}
char ch;
std::cin >> ch;
// Boost.Python doesn't support Py_Finalize yet, so don't call it!
return boost::report_errors();
}
執(zhí)行調(diào)用Python腳本的過程如下:
void exec_mythma()

{
std::cout << "exec extension module Mythma
" << std::endl;
python::dict global;
python::object result = python::exec_file(
".\\axxscript.py", global, global);

python::object world = global["world"];
CHelloWorld& py = python::extract<CHelloWorld&>(world) BOOST_EXTRACT_WORKAROUND;
std::cout << py.GetId() << std::endl;
std::cout << "success!" << std::endl;
}
三、癥狀
通過執(zhí)行PythonConsole.exe無法正常調(diào)用腳本,錯誤信息如下:
假如直接運(yùn)行腳本,結(jié)果正確。不知各位朋友發(fā)現(xiàn)問題的原因沒有?有什么解決方法?
四、測試環(huán)境
VS2008
Python2.5
Boost 1.38
測試工程下載
五:更新
終于找到問題的原因,詳見這里。

