歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 學習 Python與C相互調用

學習 Python與C相互調用

日期:2017/3/1 10:29:41   编辑:Linux編程
緣由

稀裡糊塗的,用 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 函數中將該 結構數組進行注冊
Copyright © Linux教程網 All Rights Reserved