资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

c调用python的函数,C语言调用python

我在C++中调用python写的函数为什么不行?

可以具体说一下是怎么调用的吗,像我使用C/C++调用这个外部程序(例如Python程序)时,我是这么做的,通过命令行参数通信,给个模板,注意看我的注释。

创新互联-专业网站定制、快速模板网站建设、高性价比长阳网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式长阳网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖长阳地区。费用合理售后完善,10多年实体公司更值得信赖。

C的部分(用C++也行,不过不难,也不是重点):

#includestdlib.h

#includestdio.h

int main(){

char pic_dir[255],pic_dir[255],cmd[255];

printf("What is your pic_dir? (e.g. C:\\a.jpg)\n");

/*虽然我强烈认为命名上应该不用pic_dir而是用pic_path*/

scanf("%s",pic_dir);

printf("What is your pic_name?(e.g. b.jpg)\n");

scanf("%s",pic_name);

printf("so we are calling a python program to deal with those above, please wait...\n");

sprintf(cmd,"python process.py %s %s ",pic_dir,pic_name);

/*这里是一个关键点,python的运行目录在你的PATH环境变量里有,如下图最后一行*/

system(cmd);

return 0;

}

process.py:(部分内容,主要是在process方法定义后面加一点东西)

def process(pic_dir,pic_name):

...#(这里的语句体(suite)不用改, 加上后面两句就行)

from sys import argv

process(argv[1],argv[2])

OK完成

C语言程序如何调用python程序

下面是一个例子:

首先是python的一个简单函数

class Hello:

def __init__(self, x):

self.a = x

def print(self, x=None):

print(x)

def xprint():

print("hello world")

if __name__ == "__main__":

xprint()

h = Hello(5)

h.print()1

下面是C语言

#include python3.4m/Python.h

#include stdio.h

#include stdlib.h

#include string.h

int main()

{

Py_Initialize();

// 将当前目录加入sys.path

PyRun_SimpleString("import sys");

PyRun_SimpleString("sys.path.append('./')");

// 导入hello.py模块

PyObject *pmodule = PyImport_ImportModule("hello");

// 获得函数xprint对象,并调用,输出“hello world\n”

PyObject *pfunc = PyObject_GetAttrString(pmodule, "xprint");

PyObject_CallFunction(pfunc, NULL);

// 获得类Hello并生成实例pinstance,并调用print成员函数,输出“5 6\n”

PyObject *pclass = PyObject_GetAttrString(pmodule, "Hello");

PyObject *arg = Py_BuildValue("(i)", 5);

PyObject *pinstance = PyObject_Call(pclass, arg, NULL);

PyObject_CallMethod(pinstance, "print", "i", 6);

Py_Finalize();

return 0;

}

编译命令如下:

gcc pyapi.c -lpython3.4m -o pyapi

求助 关于c程序中嵌入Python的问题

嵌入

与python的扩展相对,嵌入是把Python解释器包装到C的程序中。这样做可以给大型的,单一的,要求严格的,私有的并且(或者)极其重要的应用程序内嵌Python解释器的能力。一旦内嵌了Python,世界完全不一样了。

C调用python中的函数:

hw.py:

#coding=utf8

def hw_hs(canshu):

return canshu

if __name__ == "__main__":

ccss = "I am hw"

print hw_hs(ccss)

helloWorld.py:

#coding=utf8

import hw

def hello():

ccss = "I am helloWorld"

return hw.hw_hs(ccss)

if __name__ == "__main__":

print hello()

testcpypy.c:

//#include "testcpypy.h"

#include Python.h

#include stdio.h

#include stdlib.h

int main()

{

//初始化Python

Py_Initialize();

if (!Py_IsInitialized()) {

printf("Py_Initialize");

getchar();

return -1;

}

//执行python语句

PyRun_SimpleString("import sys");

PyRun_SimpleString("sys.path.append('./')");

PyObject *pModule = NULL;

PyObject *pFunc = NULL;

PyObject *reslt =NULL;

//载入python模块

if(!(pModule = PyImport_ImportModule("helloWorld"))) {

printf("PyImport_ImportModule");

getchar();

return -1;

}

//查找函数

pFunc = PyObject_GetAttrString(pModule, "hello");

if ( !pFunc || !PyCallable_Check(pFunc) )

{

printf("can't find function [hello]");

getchar();

return -1;

}

//调用python中的函数

reslt = (PyObject*)PyEval_CallObject(pFunc, NULL);

//printf("function return value : %d\r\n", PyInt_AsLong(reslt));

//将python返回的对象转换为C的字符串

char *resltc=NULL;

int res;

res = PyArg_Parse(reslt, "s", resltc);

if (!res) {

printf("PyArg_Parse");

getchar();

return -1;

}

printf("resltc is %s", resltc);

getchar();

//释放内存

Py_DECREF(reslt);

Py_DECREF(pFunc);

Py_DECREF(pModule);

//关闭python

Py_Finalize();

return 0;

}

编译:

gcc -o testcpypy testcpypy.c -IC:\Python27\include -LC:\Python27\libs -lpython27 ---C:\Python27为python安装目录

或:

gcc -c testcpypy.c -IC:\Python27\include

gcc -o testcpypy.exe testcpypy.o -LC:\Python27\libs -lpython27

执行结果:

带参数的情况:

#include "callpydll.h"

#include "Python.h"

#include stdio.h

#include stdlib.h

#include string.h

#include stdarg.h

int callhello(char *instr, char *outstr)

{

PyObject *pModule = NULL;

PyObject *pFunc = NULL;

PyObject *reslt = NULL;

PyObject *pParm = NULL;

char *resltc = NULL;

int resltn;

int res;

char *helloWorld = "TestIM_ProtocBuf";

char *im_account = "aaaa";

char *auth_code = "aaaa";

char *im_uid = "aaaa";

char *proxy_topic = "";

//初始化Python

Py_Initialize();

if (!Py_IsInitialized()) {

printf("Py_Initialize");

getchar();

return -1;

}

//执行python语句

PyRun_SimpleString("import sys");

PyRun_SimpleString("sys.path.append('./')");

//载入python模块

if(!(pModule = PyImport_ImportModule(helloWorld))) {

printf("PyImport_ImportModule");

getchar();

return -2;

}

//查找函数

pFunc = PyObject_GetAttrString(pModule, "login_proxy_body_serialize");

if ( !pFunc || !PyCallable_Check(pFunc) )

{

printf("can't find function [hello]");

getchar();

return -3;

}

//参数转换C -- python, 参数必须是元组(一个参数也是,否则会失败!!!坑啊)

pParm = Py_BuildValue("(ssss)", im_account, auth_code, im_uid, proxy_topic);

//调用python中的函数

reslt = (PyObject*)PyEval_CallObject(pFunc, pParm);

//将python返回的对象转换为C的字符串

res = PyArg_ParseTuple(reslt, "si", resltc, resltn);

if (!res) {

printf("PyArg_Parse");

getchar();

return -4;

}

printf("resltn is %d", resltn);

memcpy(outstr, resltc, strlen(resltc)+1);

//释放内存

Py_DECREF(reslt);

Py_DECREF(pFunc);

Py_DECREF(pModule);

Py_DECREF(pParm);

//关闭python

Py_Finalize();

return 0;

}

int main() {

int i;

char *dais = "iammain";

char res[10240];

memset(res,'\0',sizeof(res));

i = callhello(dais, res);

if(0 != i) {

printf("Notify:error");

getchar();

return -1;

}

printf("result is %s", res);

getchar();

return 0;

}

C调用Python一个运行时间长的函数,如何实时

如果要在test.py中调用脚本func.py脚本

首先,两个脚本文件要放在pythonpath下,其次在test.py脚本的开头写上import func,这样就可以直接调用func中的函数方法了。

C中调用Python函数,找不到模块

是因为你的模块的路径不对,必须先指定路径 PyObject *sys = PyImport_ImportModule("sys"); PyObject *path = PyObject_GetAttrString(sys, "path"); PyList_Append(path, PyString_FromString(""));C中调用Python函数,找不到模块

c可以调用python吗

可以的。

C中内嵌Python

新建立一个工程,首先需要将工作目录设置到Python-3.1.1PCbuild中,以获取到动态库,至于静态库的包含,Include目录的指定,那自然也是少不了的。文件中需要包含Python.h文件,这也是必须的。

接口中

Py_Initialize();

Py_Finalize();

其他的根据需求,再引入相应的python builder 即可


本文标题:c调用python的函数,C语言调用python
文章位置:http://cdkjz.cn/article/hcjejd.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220