runsisi's

technical notes

libvirt Python 绑定

2019-07-20 runsisiopenstack

libvirt 是一个 C 动态库,其 Python API 由 libvirt-python 项目下的 generator.py 生成。

一部分 Python API 通过 libvirt 的 C API 定义自动生成

$ ls /usr/share/libvirt/api/
libvirt-admin-api.xml  libvirt-api.xml  libvirt-lxc-api.xml  libvirt-qemu-api.xml

一部分 Python API 通过 override API 定义(即对 libvirt C API 有一定的封装)自动生成

$ ls *.xml
libvirt-lxc-override-api.xml  libvirt-override-api.xml  libvirt-qemu-override-api.xml

一部分 Python API 手工实现

$ ls libvirt-override*.py
libvirt-override.py                    libvirt-override-virNetwork.py
libvirt-override-virConnect.py         libvirt-override-virStoragePool.py
libvirt-override-virDomain.py          libvirt-override-virStream.py
libvirt-override-virDomainSnapshot.py

Python API 对应的动态库 wrapper so 一部分由 C API 定义自动生成,一部分由 override API 定义自动生成,其对应的 c 代码实现为

$ ls *-override.c
libvirt-lxc-override.c  libvirt-override.c  libvirt-qemu-override.c

通过如下命令生成 Python API (build/lib.linux-x86_64-2.7/libvirt*.py) 及 wrapper so 动态库 (build/lib.linux-x86_64-2.7/libvirtmod*.so):

$ ./setup.py build
$ tree build/
build/
├── lib.linux-x86_64-2.7
│   ├── libvirt_lxc.py
│   ├── libvirtmod_lxc.so
│   ├── libvirtmod_qemu.so
│   ├── libvirtmod.so
│   ├── libvirt.py
│   └── libvirt_qemu.py
├── libvirt.c
├── libvirt-export.c
├── libvirt.h
├── libvirt-lxc.c
├── libvirt-lxc-export.c
├── libvirt-lxc.h
├── libvirt_lxc.py
├── libvirt.py
├── libvirt-qemu.c
├── libvirt-qemu-export.c
├── libvirt-qemu.h
├── libvirt_qemu.py

其中:

  1. build/lib.linux-x86_64-2.7/libvirt*.py 是从 build/libvirt*.py 拷贝过去的;
  2. build/libvirt*.py 由 libvirt-override*.py 手写部分和
  3. libvirtmod.so 由 libvirt-override.c, build/libvirt.c, typewrappers.c, libvirt-utils.c 构建;
  4. libvirtmod_qemu.so 由 libvirt-qemu-override.c, build/libvirt-qemu.c, typewrappers.c, libvirt-utils.c 构建;
  5. libvirtmod_lxc.so 由 libvirt-lxc-override.c, build/libvirt-lxc.c, typewrappers.c, libvirt-utils.c 构建;