方便的boost_python

本文介绍了使用BoostPython为游戏创建脚本系统的过程。重点讲解了如何手动注册Python功能,避免依赖DLL和Python安装,更适合游戏环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

去年没发现这档子事情,自己做了个编译器玩玩,耗费了数月时间不说,实际上取得的成果也仅仅是好好复习了一遍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_python3Config.cmake` 文件及其路径和配置方法 #### 1. 理解 `boost_python3Config.cmake` 的作用 `boost_python3Config.cmake` 是由 CMake 提供的一个模块化配置文件,用于简化 Boost.Python 库的集成过程。它能够自动检测并设置 Boost.Python 的头文件路径、库路径以及其他必要的编译选项[^4]。 --- #### 2. 获取 `boost_python3Config.cmake` 文件 通常情况下,在安装 Boost.Python 后,该文件会自动生成于指定的安装路径下的 `lib/cmake/boost_python3` 目录中。如果未找到此文件,则可能是因为安装过程中缺少某些必要参数或步骤。以下是生成此文件的关键操作: - **通过 Bootstrap 和 B2 构建 Boost** 使用以下命令构建 Boost 并启用 Python 支持: ```bash ./bootstrap.sh --with-libraries=python --with-python=/usr/bin/python3.7 --prefix=/home/boost/ ./b2 install ``` - **验证安装路径** 如果成功完成上述步骤,可以在 `/home/boost/lib/cmake/boost_python3` 中找到 `boost_python3Config.cmake` 文件[^1]。 --- #### 3. 配置 CMakeLists.txt 在项目的 `CMakeLists.txt` 文件中引入 `boost_python3Config.cmake` 及其依赖项的具体方式如下所示: ```cmake # 设置 Boost 根目录 (假设已安装到 /home/boost/) set(BOOST_ROOT "/home/boost") # 查找 Boost 组件 find_package(Boost REQUIRED COMPONENTS python3) # 添加 Boost_Python 到项目 if(Boost_FOUND AND Boost_PYTHON3_FOUND) message(STATUS "Found Boost and Boost::python3") add_executable(my_project main.cpp) target_include_directories(my_project PRIVATE ${Boost_INCLUDE_DIRS}) target_link_libraries(my_project PRIVATE Boost::python3) endif() ``` 注意:确保 `${Boost_INCLUDE_DIRS}` 和 `${Boost_LIBRARIES}` 已正确定义,并指向正确的 Boost 头文件和库位置[^2]。 --- #### 4. 自动查找 Python 路径 对于动态链接 Python 解释器的情况,可以利用 Python 内部工具获取所需的路径信息: ```python import sysconfig print(sysconfig.get_path('include')) # 输出 Python include 路径 print(sysconfig.get_path('stdlib')) # 输出 Python lib 路径 ``` 这些路径应被传递给 CMake 或手动添加至环境变量中以便正确解析[^3]。 --- #### 5. 常见错误处理 当遇到类似于 `Could not find a package configuration file provided by 'boost_python3'` 错误时,需确认以下几点: - 是否正确指定了 BOOST_ROOT; - 安装后的 `boost_python3Config.cmake` 文件是否存在目标路径下; - 若仍无法定位,尝试重新运行 b2 编译脚本以更新缺失组件。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值