Python在FreeCAD中的封装
Python解释器使得脚本编写、宏录制等功能变得神奇。然而,将C++代码封装到Python中是一个复杂的故事。
将C++封装成Python模块的概述
- C++到Python封装的工具列表:如果头文件可用,封装二进制库是可能的。这里列出了将C/C++封装到Python中的非详尽方法,并检查GitHub - qingfengxia/python_wrap: Demonstration, comparison and interopereation of different c++11 class python wrapping methods, like swig, pybind11, binder, cython, cppyy, etc, with CMake integration setup.以获取最新的示例代码和CMake集成工作流。
- C代码/库接口:使用C-API和
ctypes
库。 - 使用C++模板简化封装:如
boost.python
和pybind11
。 - 自动绑定生成:如
cppyy
和PyBindGen
。 - 特定项目的专用封装工具:如Qt5和GTK3。
Pybind11示例封装代码
Pybind11是一个基于C++11特性的解决方案,API类似于但更简单于boost::python。它仅包含头文件,生成的二进制胶水代码更小,构建速度更快。
比较不同方法
作者设置了一个开源仓库GitHub - qingfengxia/python_wrap: Demonstration, comparison and interopereation of different c++11 class python wrapping methods, like swig, pybind11, binder, cython, cppyy, etc, with CMake integration setup.,用于演示、比较和互操作不同的C++11类Python封装方法,如SWIG、pybind11、binder、cython、cppyy等,并带有CMake集成设置。
在FreeCAD中混合使用C++和Python
FreeCAD通过FreeCADInit.py
将模块路径添加到Python的sys.path
中,并在每个模块中运行"Init.Py"。PythonObject有它自己的继承树,与FreeCAD中的cpp对象树几乎并行。
Python模块的限制(除性能外)
对于小项目,建议使用pybind11以可管理的方式编写Pythonic接口。对于包含数十个头文件的项目,推荐使用binder自动生成样板封装代码。
Python对象序列化
在FreeCAD中,纯Python特性对象通过Python的JSON模块保存在FcStd文件中。出于安全原因,避免使用cPickle。
Python导出类(双胞胎类)概念
DocumentObjectPy
是App::DocumentObject
的Python导出类(双胞胎类)。XML文件不是手动编码的,而是在构建时由cmake宏转换为.h和.cpp文件。
Python与Qt4/Qt5支持
建议使用兼容层如"Qt.py"或"qtpy"来支持不同的绑定:PyQt4、PyQt5、PySide和PySide2。
Python 3支持正在进行中
对于模块开发者来说,现在是时候使模块兼容Python 2和Python 3了。
编写Python 2-3兼容代码的速查表
提供了一个PDF版本的速查表,展示如何编写与Python 2和3都兼容的代码。
FreeCAD中的Python封装选择
FreeCAD的Python API主要是手动创建的。不推荐直接使用<Python.h>
C API,因为它不兼容Python 2.7到Python 3.3+的迁移。
工作流:编写Python双胞胎类
在FreeCAD中,可以通过XML文件和CMake宏自动生成Python封装代码。