c调python函数 c调用pyd

c调用python训练模型,输入怎么设置可以使用Python的ctypes模块来实现C和Python之间的通信,从而实现C调用Python训练模型的输入 。
ctypes模块提供了一种调用共享库的方法 , 可以将Python的变量和函数转换为C语言的变量和函数,从而实现C调用Python的功能 。
要实现C调用Python训练模型的输入,需要做的第一步是在C程序中定义一个Python函数,并将其转换为C函数 。然后 , 可以使用ctypes模块将Python函数转换为C函数 , 从而实现C调用Python训练模型的输入 。
C语言程序如何调用python程序下面是一个例子:
首先是python的一个简单函数
class Hello:
def __init__(self, x):
self.a = x
def print(self, x=None):
print(x)
def xprint():
print("hello world")
【c调python函数 c调用pyd】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的扩展相对c调python函数,嵌入是把Python解释器包装到C的程序中 。这样做可以给大型的c调python函数,单一的,要求严格的 , 私有的并且(或者)极其重要的应用程序内嵌Python解释器的能力 。一旦内嵌了Python,世界完全不一样了 。
C调用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, 参数必须是元组(一个参数也是,否则会失败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写的函数为什么不行?可以具体说一下是怎么调用的吗,像我使用C/C调用这个外部程序(例如Python程序)时,我是这么做的,通过命令行参数通信,给个模板 , 注意看我的注释 。
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/c调用python中返回值为list的函数在C/C中调用了这个函数之后不是会返回一个PyObject对象吗?那个对象就是一个List?。?然后使用PyList_Size()获取它的大小,使用PyList_GetItem()去读取其中的元素就ok了啊 。
找下Python的C API Manual,里面这些函数的用法写的很详细的 。
c调python函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c调用pyd、c调python函数的信息别忘了在本站进行查找喔 。

    推荐阅读