学习 Python与C相互调用


缘由

稀里糊涂的,用 Python 或用 C++ Qt都能写点小程序出来。然后对Python + Qt开始有点兴趣:想学PyQt4,想了解PythonQt,也期待PySide的Windows版本。但总觉得这三个东西都蛮神秘的,看看资料也总是似懂非懂

  • PythonQt 是从 C++ 调用 Python (类似QtScript)

  • PyQt4 和 PySide 是从 Python 调用 C++

  • http://www.pyside.org

  • http://www.riverbankcomputing.co.uk

  • http://pythonqt.sourceforge.net/

怎么办呢?还是从基础开始吧:应该是就是 Python 与 C 的相互调用了(先找找资料,整理一下思路)

Python 与 C

Python 与 C 的相互交互方式可看成有两种:

  • 扩展:从 Python 中调用 C
  • 嵌入:从 C 中调用 Python

python manual

  • Extending and Embedding the Python Interpreter

  • Python/C API Reference Manual

其他:

  • Programming Python 第22章、第23章
  • Python C API 使用心得

  • Python与C之间的相互调用(Python C API及Python ctypes库)

Python 调用 C 模块

用 Python 来调用 C 模块,即:用 C 来扩展 Python。

  • 需要写C代码
  • 编译成动态库

比如 我们编写一个 C 函数

void abcd()
{
}

然后将其编译成 abcd.dll

但要使得 C 能被 Python 调用,仅这样还不行,我们写的C的代码需要遵循某种规则,只有这样,Python才能识别这个模块

比如:我们想用下面的代码来调用 上面的函数:

import abcd
abcd.abcd()
  • 首先,需要 abcd 这个模块,.dll不行,不过将其改成.pyd 后python就理会它了
  • 然后,python 将从 .pyd 中调用 initabcd() 来完成模块的初始化

也就是说,我们需要一个函数

PyMODINIT_FUNC initabcd();
  • 该初始化函数将告诉Python它有哪些函数,这是通过一个结构数组来实现的
static struct PyMethodDef anyname[]={}
  • 我们需要将我们前面的函数信息添加到该结构数组中,然后在前面的init函数中将该数组注册,但是,一开始的函数还是不能直接用,我们需要
static PyObject * wrap(PyObject * self, PyObject * args)
  • Python 要求这样用这样的函数。这样一来,就理通了:
    • 编写我们自己的函数 abcd
    • 编写符合python要求的 wrap 来调用 abcd
    • 将 wrap 函数的信息以及我们想要的名字 "abcd" 放入结构数组
    • 在 init 函数中将该 结构数组进行注册
  • 1
  • 2
  • 下一页

相关内容