师傅你而 发表于 2017-4-29 11:09:02

在python中调用C扩展和C扩展中调用python

1.python使用c扩展后,python程序也可支持多核
  下面是test_py_call_c.c的代码:
  #include "Python.h"
  static PyObject* mylooptest(PyObject *self, PyObject *args)
  {
  int i = 0;
  Py_BEGIN_ALLOW_THREADS
  while (1)
  {
  ++i;
  }
  Py_END_ALLOW_THREADS
  Py_INCREF(Py_None);
  return Py_None;
  }
  static PyMethodDef mytestMethods[] =
  {
  {"mylooptest", mylooptest, METH_VARARGS, "for test use multi cpu"},        
  {NULL, NULL, 0, NULL}
  };
  void inittest_py_call_c(void)
  {
  Py_InitModule3("test_py_call_c", mytestMethods, "py call python test module");
  }
  编译成动态库,gcc -shared test_py_call_c.c  -o test_py_call_c.so -I /usr/local/include/python2.5/
  执行python
  在python的命令行输入:
  import test_py_call_c
  from twisted.internet import reactor(注:这里使用了twisted,没用过的自己看help)
  reactor.callInThread(test_py_call_c.mylooptest)
  reactor.callInThread(test_py_call_c.mylooptest)
  reactor.run()
  这样python就同时在两个线程中运行test_py_call_c.mylooptest,此时可以看到CPU达到了180%,python也可以使用多核了。
2.c扩展中调用python函数
  下面是test_c_call_py.c的代码
  #include "Python.h"
  PyObject *my_callback = NULL;
  static PyObject* my_set_callback(PyObject *self, PyObject *args)
  {
  PyObject *result = NULL;
  PyObject *temp = NULL;
  if (PyArg_ParseTuple(args, "O", &temp)) {
  if (!PyCallable_Check(temp)) {
  PyErr_SetString(PyExc_TypeError, "parameter must be callable");
  return NULL;
  }
  Py_XINCREF(temp);
  Py_XDECREF(my_callback);
  my_callback = temp;
  Py_INCREF(Py_None);
  result = Py_None;
  }
  return result;
  }
  static PyObject* my_test_callback(PyObject *self, PyObject *args)
  {
  PyObject * result = NULL;
  result = PyEval_CallObject(my_callback, args);
  if (result == NULL)
  return NULL;
  Py_DECREF(result);
  Py_INCREF(Py_None);
  return Py_None;
  }
  static PyMethodDef mytestMethods[] =
  {
  {"mysetcallback", my_set_callback, METH_VARARGS, "we set a call back function so that call it in C"},
  {"mytestcallback", my_test_callback, METH_VARARGS, "we use this function to test call back function"},
  {NULL, NULL, 0, NULL}
  };
  void inittest_c_call_py(void)
  {
  Py_InitModule3("test_c_call_py", mytestMethods, "c call python test module");
  }
  编译成动态库,gcc -shared test_c_call_py.c  -o test_c_call_py.so -I /usr/local/include/python2.5/
  在python命令行下:
  敲入
  def test(a,b,c):
  print 'test %d, %d, %d\n' % (a, b, c)
  test_c_call_py.mysetcallback(test)
  test_c_call_py.mytestcallback(1,2,3)
  最后显示:test 1, 2, 3
页: [1]
查看完整版本: 在python中调用C扩展和C扩展中调用python