方便的boost_python
去年没发现这档子事情,自己做了个编译器玩玩,耗费了数月时间不说,实际上取得的成果也仅仅是好好复习了一遍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本身的例子来看,对不起!
方便的boost_python相关推荐
- CentOS 7 安装Boost 1.67及boost_python
获取boost boost官网:https://www.boost.org/ wget https://dl.bintray.com/boostorg/release/1.67.0/source/bo ...
- 20行Python代码给微信头像戴帽子
作者 | Leauky,北理工硕士在读,非CS专业的Python爱好者. 朋友圈里@微信官方要求戴圣诞帽的活动曾经火爆一时,有些会玩的小伙伴都悄咪咪地用美图秀秀一类的 app 给自己头像 p 一顶,然 ...
- python和c学习-python与c++交互学习入门之5
这次讲讲,如何扩展c++库.通过boost.python把c++库编译成python能够调用的dll. 通过上一次的教程后,大家都应该会使用boost.python了.把c++程序编译成pyd文件.由 ...
- c语言 python rsa库_Python遇到性能瓶颈怎么办?
在Python遇到性能瓶颈时怎么办? 答案是找对应功能的C/C++程序,把它编译成CPython模块,供Python调用来提高性能. 比如Python中做科学计算,数据处理的Numpy模块就是使用C语 ...
- Boost.python 编译和使用
cent os 1) 安装python yum install python26 2) 安装python devel yum search python | grep -i devel yum in ...
- c调用python打包_如何将C++的API封装成python可调用形式?
个人觉得boost是最爽的方式.cython虽然速度不错,但是很多时候是要重新实现代码的.boost可以直接调用c++/C代码. 概述 有不同的方法来用C++扩展Python:Swig 使用Boost ...
- python基础系列教程——python所有包库的下载
下载地址:https://pypi.python.org/pypi?%3Aaction=browse 支持搜索 Index by date: multidict pymatgen moderngl j ...
- Ubuntu 15.04 安装 boost-python
1. 安装依赖库 sudo apt-get install python-dev sudo apt-get install mpi-default-dev #安装mpi库 sudo apt-get i ...
- 多个cpp文件生成so_boostpython:从多个.cpp文件创建一个模块(.so)
我开始在C++中编写一些我想在Python代码中调用的模块.为此,我使用boostpython.随着代码的增长,我决定将其分成几个.cpp文件.现在,我有了这样的东西: 食品.cpp#include ...
最新文章
- atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty HttpListener...
- IASetIndexBuffer Offset
- 行业观察 | 全球IoT云平台第一股诞生,IoT离爆发还有多远?
- 转载--httpclient原理和应用
- c++ STL find search
- 鼠标经过图片抖动效果
- mysql --force -f_Mysql_mysql force Index 强制索引
- WPF自定义动画控件 风机
- Android新增输入设备
- 分布式存储系统学习笔记(一)—什么是分布式系统(4)—容错机制
- 【ASP.NET Web API教程】1 ASP.NET Web API入门
- 三维空间点到线段的距离
- 计算机控制技术课程简介与资料
- 成功架构设计的关键要素
- 7-6 jmu-python-随机生成密码 (10 分)习题解答
- [BZOJ3772]精神污染(dfs序+主席树)
- hadoop+HBase+ZooKeeper+Hive完全分布式集群部署安装
- Kafka KSQL
- 解决 Successfully created project '' on GitHub, but initial push failed: Could not read from remote
- django haystack一次使用总结
热门文章
- Mel滤波器组的设计与实现(基于MATLAB和Python)
- 基于Springboot开发的家庭财务管理系统
- Yarn基本架构和工作机制
- Markdown矩阵、表格和数学公式
- Linux centos7 Linux网络相关、firewalld和netfilter、netfilter5表5链介绍、iptables语法
- Hello!The familiar and strange world.
- Delphi中的指针类型
- VC检测OLE控件是否已经注册,并注册它
- VC10中的C++0x特性简介
- xp 安装mysql数据库_Windows XP系统中安装MySQL5.5.28数据库图文教程