去年没发现这档子事情,自己做了个编译器玩玩,耗费了数月时间不说,实际上取得的成果也仅仅是好好复习了一遍C++。
最近数日闲来无事,突然发现去年觉得如虎狼的Boost Python居然如此简单,遂引用之做一脚本系统,不日而成,大喜!
Boost Python本身的例子大家就可以看到其方便之处,可以导出函数,这很SOSO,一句话就可导出一个函数,根本不用去管什么返回值、参数等等。此外,也可以导出类,这就很不简单了,我见过有些人写的Python导出库,怎么说呢,只能导出函数,类是根本都导出不了的。虽说游戏脚本用类的很少,但这起码是一种功能上的缺憾,类是一种有效的数据和算法组织方式,有了总是好的。
众看官少安毋躁,听我先说两个名词解释:
导出,地球人都知道,把C++程序里的某些函数 导出 ,以使得Python能使用它们,这个动作叫导出。
导入,即是相反的过程,在C++程序里运行Python脚本,这是游戏脚本一个很重要的方面。在做控制台、GUI脚本、逻辑控制的时候,导入都很重要。一般说来,Python的导入都是通过Py_RunXXX来实现的。
关键点要来了~
Boost Python默认情况下,仅会将函数导出作为Python IDLE的插件,供Python IDLE使用。而在我们游戏中,一般如下:
游戏的开始,将所有函数全部导出到各个模块中,并在Python中注册这些模块。游戏运行时调用Python语句。
导出好做,导入也好做,中间这一环,在Python中注册,就不好办了。Boost的解法是:将导出函数打包成一个DLL,将这个DLL放到Python的几个插件Dir中去,然后就可以在任何地方访问这些导出的功能了。
但是我们游戏不需要这样,一般都是游戏运行一次,注册一堆导出函数,运行完毕后,这些导出功能也就没了意义了,干嘛让他们死皮赖脸地守在插件Dir里面呢?还有,插件Dir是Python自己的特性,难道说要让每一个游戏客户端都必须安装Python吗?那也太垃圾了。
今天突然来了个念头,Python如何从Dll中找到相应的导出函数呢?一定是Dll中有相应的DllExport,于是根据这个想法顺藤摸瓜,果然,INIT_MODULE(p)宏其实本身就是一个DllExport函数,函数名就是init+p(其实没有这个加号,例如一个名叫HAHA的Module,这个函数名应该是initHAHA)。
好,剩下的问题就很简单了,我们不要Python来装载注册插件Dll了,我们自己来装载这些功能!方法就是在游戏的开头,导出完所有的导出函数和Module后,由我们自己来调用initHAHA,手动通知Python来注册相应的功能。
代码大约如下:(伪代码,请参考BoostPython例子进行修改)
INIT_MODULE(HAHA)
{
......
}
void main()
{
Py_Initialize();
initHAHA(); // 其实就这一行就可以完成注册!
// Have Fun
// End
Py_Finalize();
}
由于东西是在公司写的,所以家里没有源码,凭记忆写下一些函数,名称上可能有出入,因此请参考BoostPython本身的例子来看,对不起!
分享到:
相关推荐
在Python中使用Boost扩展模块,可以方便地调用这些强大的C++组件,提高代码运行速度,同时利用Python的易用性和丰富的生态系统。 `boost_python-1.55.win32-py3.3` 是一个针对Python 3.3版本、Windows 32位系统的...
boost_python-1.72-cp38-cp38-win32
boost_python-1.72-cp36-cp36m-win32
boost_python-1.76-cp310-cp310-win_amd64
boost_python-1.72-cp39-cp39-win32
boost_python-1.72-cp37-cp37m-win_amd64
Boost库中的`boost_python`是用于C++和Python之间互操作的模块,使得开发者可以方便地在C++中调用Python代码,或者在Python中调用C++编写的高效算法。本主题主要关注如何在Visual Studio 2003(VS2003)环境下,结合...
Boost.Python库是Boost库的一部分,它为C++程序员提供了与Python编程语言交互的接口。在给定的压缩包文件中,包含的是针对Visual Studio 2008(即VS2008)和Python 2.6环境下的Boost.Python库的编译版本,版本号为...
boost_python-1.76-cp310-cp310-win32
BOOST_PYTHON_MODULE(hello_ext) { // hello_ext为导出python模块的名字 using namespace boost::python; def("greet", greet); // 导出函数greet def("add", add); // 导出函数add def("vprint", vprint); // ...
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl...
**Ada Boost 算法详解** Ada Boost,全称为Adaptive Boosting,是一种集成学习方法,主要用于构建强分类器。...通过实践和探索`ada_boost_alpha.py`,你将能掌握Ada Boost的Python实现,并应用于实际项目中。
boost_python-1.72-cp36-cp36m-win_amd64
Boost库是C++编程语言中的一个开源库,它提供了大量高效、高质量的工具,涵盖了算法、数据结构、I/O操作、多线程、数学运算、图形界面、网络编程等多个领域。这个"boost_1_79_0源码安装包"是Boost库的第1.79.0版本,...
本资源是boost1.60源码库编译的python模块动态链接库包含x64 release和debug版本,所用的python为64位的python2.7.9 。 boost_python-vc140-mt-1_60.dll boost_python-vc140-mt-1_60.lib boost_python-vc140-mt-gd-...
标题中的"boost_python-1.55.win32-py3.3.zip"指的是Boost.Python库的一个特定版本,这是Boost库的一部分,用于在Python编程语言中与C++交互。这个版本是1.55版,针对的是32位Windows操作系统,并且是为Python 3.3...
boost 1.47在VS2010下编译好的静态库 release版本:libboost_python-vc100-mt-1_47.lib debug版本:libboost_python-vc100-mt-gd-1_47.lib
环境 vs2008 构建 python26 boost_1_44 使用boost.python 编写扩展python库,使用mfc例子调用扩展的python库。 myPydll 工程为扩展python库,生成文件myPydll.dll,将该文件拷贝到python解释器可搜索的路径下,如...
boost_python-1.78-cp310-cp310-win_amd64.whl
boost_python-1.78-cp311-cp311-win_amd64.whl