C调用Python脚本代码

4 篇文章 0 订阅
3 篇文章 0 订阅

 

C调用Python脚本文件里的函数

#Python脚本,存为pytest.py
def add(a,b):
    print "in python function add"
    print "a = " + str(a)
    print "b = " + str(b)
    print "ret = " + str(a+b)
    return a + b

// C代码调,用上面的add函数
#include <stdio.h>
#include <stdlib.h>
#include "C:/Python26/include/python.h"
#pragma comment(lib, "C:\\Python26\\libs\\python26.lib")

int main(int argc, char** argv)
{
    // 初始化Python
    //在使用Python系统前,必须使用Py_Initialize对其
    //进行初始化。它会载入Python的内建模块并添加系统路
    //径到模块搜索路径中。这个函数没有返回值,检查系统
    //是否初始化成功需要使用Py_IsInitialized。

    PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pRetVal;

    Py_Initialize();
    // 检查初始化是否成功
    if ( !Py_IsInitialized() ) 
    {
        return -1;
    }

    // 载入名为pytest的脚本(注意:不是pytest.py)
    pName = PyString_FromString("pytest");
    pModule = PyImport_Import(pName);
    if ( !pModule )
    {
        printf("can't find pytest.py");
        getchar();
        return -1;
    }
    pDict = PyModule_GetDict(pModule);
    if ( !pDict ) 
    {
        return -1;
    }

    // 找出函数名为add的函数
    pFunc = PyDict_GetItemString(pDict, "add");
    if ( !pFunc || !PyCallable_Check(pFunc) )
    {
        printf("can't find function [add]");
        getchar();
        return -1;
    }

    // 参数进栈
    pArgs = PyTuple_New(2);

    // PyObject* Py_BuildValue(char *format, ...)
    // 把C++的变量转换成一个Python对象。当需要从
    // C++传递变量到Python时,就会使用这个函数。此函数
    // 有点类似C的printf,但格式不同。常用的格式有
    // s 表示字符串,
    // i 表示整型变量,
    // f 表示浮点数,
    // O 表示一个Python对象。

    PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",3)); 
    PyTuple_SetItem(pArgs, 1, Py_BuildValue("l",4));

    // 调用Python函数
    pRetVal = PyObject_CallObject(pFunc, pArgs);
    printf("function return value : %ld\r\n", PyInt_AsLong(pRetVal));

    Py_DECREF(pName);
    Py_DECREF(pArgs);
    Py_DECREF(pModule);
    Py_DECREF(pRetVal);

    // 关闭Python
    Py_Finalize();
    return 0;
}


***********************************************************************
另一段相似代码:
call.py脚本代码:

def test():
    print 'hello world'
def add(a,b):
    return a + b

C代码:

#include <stdio.h>
#include <stdlib.h>
//包含python.h头文件
#include <Python.h>

int main(int argc, char *argv[])
{
 printf("enter to main!\n");
 //初始化python
 Py_Initialize(); 
 if(!Py_IsInitialized())  
 { 
  return -1; 
 } 
 
 //执行python语句
 PyRun_SimpleString("import sys");
 PyRun_SimpleString("sys.path.append('./')");
 PyRun_SimpleString("print 'Code by HL'");


 PyRun_SimpleString("import call");
 PyRun_SimpleString("call.test()");
 PyRun_SimpleString("print call.add(1,4)");
// PyRun_SimpleString("print call.version");


 PyObject* pName;
 PyObject* pModule;
 PyObject* pDict;
 PyObject* pFunc;

 //文件名--call.py
 pName = PyString_FromString("call");
 //import call
 pModule = PyImport_Import(pName);
 if(!pModule)
 {
  printf("can't find call.py");
  getchar();
  return -1;
 }

 //取得模块
 pDict = PyModule_GetDict(pModule);
 if(!pDict)
 {
  return -1;
 }

 {
  //取得函数
  pFunc = PyDict_GetItemString(pDict,"test");
  if(!pFunc || !PyCallable_Check(pFunc))
  {
   printf("can't find function [test]");
   getchar();
   return -1;
  }
  
  //调用函数
  PyObject_CallObject(pFunc,0);
 }

 {
  pFunc = PyDict_GetItemString(pDict,"add");
  if(!pFunc || !PyCallable_Check(pFunc))
  {
   printf("can't find function [add]");
   getchar();
   return -1;
  }

  PyObject* args = PyTuple_New(2);
  PyTuple_SetItem(args,0,Py_BuildValue("l",3));
  PyTuple_SetItem(args,1,Py_BuildValue("l",4));
  PyObject *pAdded = PyObject_CallObject(pFunc,args);
  int ret = PyInt_AsLong(pAdded); 
  printf("add value:%d\n",ret);
  Py_DECREF(args);
 }   

 Py_DECREF(pName);
 Py_DECREF(pDict);
 Py_DECREF(pModule);
 Py_Finalize();   
 system("PAUSE");   
 return 0;
}

注意脚本要复制到C工程目录下,另外要包含Python.h文件,必须添加包含文件目录C:\Program Files\Python\include;另外添加库文件目录C:\Program Files\Python\libs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值