歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Python 3.2下調用C動態鏈接庫

Python 3.2下調用C動態鏈接庫

日期:2017/3/1 10:29:47   编辑:Linux編程

python和C,我覺得這簡直是無敵的組合啊。一般性的業務邏輯用python快速出模型,而碰到python運行緩慢的操作,則可以通過調用C編譯好的鏈接庫來完成。

在python3.2下,可以通過ctype模塊單純的訪問C鏈接庫,也可以通過傳統方式訪問。ctype模塊固然方便,但若要求回調的話,還是得用傳統方式操作。

今天查閱了官方manual和網上一些鏈接,感覺有些出處,在這寫上一個3.2.2的簡單程序:

編輯一個文件lzymodule.c

按官方命名方式,前面是模塊名,後面是module.c

  1. #include <Python.h> //必須先include Python.h,Python.h中包含了一些預編譯宏,包括了一些stdlib.h之類的頭文件
  2. /* 將要調用的函數,我提出來了 */
  3. long func1(long a, long b)
  4. {
  5. return a + b;
  6. }
  7. /* 方法名字命名規范是“模塊名_方法名”,我這裡的方法名是system */
  8. static PyObject *
  9. lzy_system(PyObject *self, PyObject *args)
  10. {
  11. const char *command;
  12. long a, b;
  13. int sts;
  14. if (!PyArg_ParseTuple(args, "ii", &a, &b)) //讀入兩個整形參數,轉成C類型
  15. return NULL;
  16. //sts = system(command);
  17. sts = func1(a, b);
  18. return PyLong_FromLong(sts); //返回前,需要轉成PyObject類型
  19. }
  20. /* 定義模塊中的方法 */
  21. static PyMethodDef LzyMethods[] =
  22. {
  23. {"func", lzy_system, METH_VARARGS, "my first test function"}, //注意func是在python中調用的名字,這裡應該取system才規范
  24. {NULL, NULL, 0, NULL}
  25. };
  26. /* 定義模塊 */
  27. static struct PyModuleDef lzymodule =
  28. {
  29. PyModuleDef_HEAD_INIT,
  30. "lzy",
  31. NULL,
  32. -1,
  33. LzyMethods
  34. };
  35. /* 這個就相當於主函數了,命名一定要為“PyInit_模塊名” */
  36. PyMODINIT_FUNC PyInit_lzy(void)
  37. {
  38. return PyModule_Create(&lzymodule);
  39. }

之後進行編譯

  1. gcc lzymodule.c -shared -I /usr/local/include/python3.2m/ -o lzy.so -fPIC

最後進入python,試試

  1. import lzy
  2. lzy.func(1, 230)

注,不願意gcc的話,試試這個腳本 見 http://www.linuxidc.com/Linux/2012-02/55038.htm

  1. from distutils.core import setup, Extension
  2. test_mod = Extension('lzy', sources = ['lzymodule.c'])
  3. setup(name = 'lzy',
  4. version = '1.0',
  5. description = 'lzy test extension module',
  6. ext_modules = [test_mod])

  1. python setup.py build
  2. python setup.py install
Copyright © Linux教程網 All Rights Reserved