1. 苏葳的备忘录首页
  2. 编程

C语言中调用Python函数

gcc python linuxC中可以嵌入方式调用Python脚本程序。混合语言编程的唯一好处就是取长补短。比如C语言的性能和底层操作能力。Python则有高级数据结构和各种功能强大的模块。我们假设有一个中间业务平台,用C开发通讯层,但业务流程用C开发却并不合适。C缺乏高级文本处理函数,不够简练,任何一个无关紧要的变量都需要强类型定义并分配好空间。这些特点让人难于把精力投放在实现业务逻辑上。而Python语言正好适合去做这些。

下面是一个C调用Python脚本的例子:

#include <Python.h>
int main(int argc, char *argv[])
{
  PyObject *pName, *pModule, *pDict, *pFunc, *pArg, *pRetVal;
  Py_Initialize();
  if ( !Py_IsInitialized())
  {
      return -1;
  }
  /*
  PyRun_SimpleString("from time import time,ctime\n"
                     "print 'Today is',ctime(time())\n");
                     */
  if(!(pModule = PyImport_ImportModule("test")))
  {
    printf("2\n");
      return -2;
  }
  if(!(pFunc = PyObject_GetAttrString(pModule,"add")))
  {
      printf("3\n");
      return -3;
  }
   pArg = Py_BuildValue("(i,i,{s:i,s:i})",33,44,"aa",10,"bb",20);  //函数参数为两个整型,一个字典型,字典型有两个值。
  pRetVal = PyObject_CallObject(pFunc,pArg);
/*  printf("%d\n",PyInt_AsLong(pRetVal));*/
  Py_Finalize();
  return 0;
}

此程序在编译时,首先报错“3”。test.py中确有add函数。原因何在?是因为python本身有test模块,如此形式的import会把默认模块调入,当然找不到add函数。

那么改名test1.py呢,这次错误报“2”。原因是找不到test1.py,即使把test1.py放在此C程序的同一目录下也不行。需要在import前加入系统路径:

  PyRun_SimpleString("import sys");
  PyRun_SimpleString("sys.path.append('//home//sdfdf//src//busilibs')");

将当前目录加入系统路径后,就能找到test1.py了,运行正常。

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/399.html

发表评论

邮箱地址不会被公开。 必填项已用*标注