c調(diào)用python函數(shù) python如何調(diào)用c++編寫(xiě)的代碼

c可以調(diào)用python嗎

可以的。

創(chuàng)新互聯(lián)建站專注于企業(yè)網(wǎng)絡(luò)營(yíng)銷推廣、網(wǎng)站重做改版、羅城網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5技術(shù)商城開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為羅城等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

C中內(nèi)嵌Python

新建立一個(gè)工程,首先需要將工作目錄設(shè)置到Python-3.1.1PCbuild中,以獲取到動(dòng)態(tài)庫(kù),至于靜態(tài)庫(kù)的包含,Include目錄的指定,那自然也是少不了的。文件中需要包含Python.h文件,這也是必須的。

接口中

Py_Initialize();

Py_Finalize();

其他的根據(jù)需求,再引入相應(yīng)的python builder 即可

C語(yǔ)言程序如何調(diào)用python程序

下面是一個(gè)例子:

首先是python的一個(gè)簡(jiǎn)單函數(shù)

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語(yǔ)言

#include python3.4m/Python.h

#include stdio.h

#include stdlib.h

#include string.h

int main()

{

Py_Initialize();

// 將當(dāng)前目錄加入sys.path

PyRun_SimpleString("import sys");

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

// 導(dǎo)入hello.py模塊

PyObject *pmodule = PyImport_ImportModule("hello");

// 獲得函數(shù)xprint對(duì)象,并調(diào)用,輸出“hello world\n”

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

PyObject_CallFunction(pfunc, NULL);

// 獲得類Hello并生成實(shí)例pinstance,并調(diào)用print成員函數(shù),輸出“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

求助 關(guān)于c程序中嵌入Python的問(wèn)題

嵌入

與python的擴(kuò)展相對(duì),嵌入是把Python解釋器包裝到C的程序中。這樣做可以給大型的,單一的,要求嚴(yán)格的,私有的并且(或者)極其重要的應(yīng)用程序內(nèi)嵌Python解釋器的能力。一旦內(nèi)嵌了Python,世界完全不一樣了。

C調(diào)用python中的函數(shù):

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;

}

//執(zhí)行python語(yǔ)句

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;

}

//查找函數(shù)

pFunc = PyObject_GetAttrString(pModule, "hello");

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

{

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

getchar();

return -1;

}

//調(diào)用python中的函數(shù)

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

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

//將python返回的對(duì)象轉(zhuǎn)換為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();

//釋放內(nèi)存

Py_DECREF(reslt);

Py_DECREF(pFunc);

Py_DECREF(pModule);

//關(guān)閉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

執(zhí)行結(jié)果:

帶參數(shù)的情況:

#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;

}

//執(zhí)行python語(yǔ)句

PyRun_SimpleString("import sys");

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

//載入python模塊

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

printf("PyImport_ImportModule");

getchar();

return -2;

}

//查找函數(shù)

pFunc = PyObject_GetAttrString(pModule, "login_proxy_body_serialize");

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

{

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

getchar();

return -3;

}

//參數(shù)轉(zhuǎn)換C -- python, 參數(shù)必須是元組(一個(gè)參數(shù)也是,否則會(huì)失?。。。】影。?/p>

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

//調(diào)用python中的函數(shù)

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

//將python返回的對(duì)象轉(zhuǎn)換為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);

//釋放內(nèi)存

Py_DECREF(reslt);

Py_DECREF(pFunc);

Py_DECREF(pModule);

Py_DECREF(pParm);

//關(guān)閉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;

}

怎樣把Python代碼嵌入到C程序

步驟1:安裝Python開(kāi)發(fā)包

由于需要訪問(wèn)Python/C API,首先安裝Python開(kāi)發(fā)包。

在Debian,Ubuntu或Linux Mint中:

在CentOS,F(xiàn)edora或RHEL中:

安裝成功后,Python頭文件在/usr/include/python2.7。根據(jù)Linux發(fā)行版的不同,確切的路徑可能是不相同的。例如,CentOS 6中是/usr/include/python2.6。

步驟2:初始化解釋器并設(shè)置路徑

C中嵌入Python的第一步是初始化Python解釋器,這可以用以下C函數(shù)完成。

初始化解釋器后,需要設(shè)置你的C程序中要導(dǎo)入的Python模塊的路徑。例如,比如你的Python模塊位于/usr/local/modules。然后使用以下C函數(shù)調(diào)用來(lái)設(shè)置路徑。

步驟3:數(shù)據(jù)轉(zhuǎn)換

C中嵌入Python最重要的方面之一是數(shù)據(jù)轉(zhuǎn)換。從C中傳遞數(shù)據(jù)到Python函數(shù),需要首先將數(shù)據(jù)從C數(shù)據(jù)類型轉(zhuǎn)換到Python數(shù)據(jù)類型。Python/C API提供各種函數(shù)來(lái)實(shí)現(xiàn)這。例如,轉(zhuǎn)換C字符串到Python字符串,使用PyString_FromString函數(shù)。

另外一個(gè)類似函數(shù)PyInt_FromLong,將C中l(wèi)ong數(shù)據(jù)類型轉(zhuǎn)換為Python int。每個(gè)Python/C API函數(shù)返回一個(gè)PyObject類型的引用。

步驟4:定義一個(gè)Python模塊

當(dāng)你想嵌入Python代碼到另一種語(yǔ)言如C,該代碼需要被寫(xiě)成Python模塊,然后用另一種語(yǔ)言“導(dǎo)入”。所以讓我們來(lái)看看如何在C中導(dǎo)入Python模塊。

為了進(jìn)行說(shuō)明,我們實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Python模塊例子如下:

以上的Python函數(shù)有一個(gè)字符串作為參數(shù)并返回兩個(gè)重復(fù)的字符串。例如,如果輸入字符串是“cyberpersons”,該函數(shù)返回'cyberpersonscyberpersons'。此模塊文件命名為“printData.py”并將它放在前面聲明的Python模塊目錄中(/usr/local/modules)。

步驟5:加載一個(gè)Python模塊

現(xiàn)在你已經(jīng)定義了Python模塊,是時(shí)候在C程序中加載它了。導(dǎo)入模塊的C代碼看起來(lái)像這樣:

步驟6:構(gòu)建函數(shù)的參數(shù)

當(dāng)加載一個(gè)模塊時(shí),可以調(diào)用模塊中定義的Python函數(shù)。通常,我們需要傳遞一個(gè)或多個(gè)參數(shù)到一個(gè)Python函數(shù)。我們必須構(gòu)建一個(gè)Python元組對(duì)象,它包括Python函數(shù)中的參數(shù)。

在我們的例子中,printData函數(shù)定義帶一個(gè)參數(shù)的模塊。因此,我們構(gòu)建一個(gè)大小是一的Python元組對(duì)象如下。我們可以使用PyTuple_SetItem設(shè)置元組對(duì)象的每個(gè)項(xiàng)。

我們已經(jīng)成功構(gòu)建一個(gè)參數(shù)傳遞到函數(shù)調(diào)用,是時(shí)候從C程序調(diào)用python函數(shù)了。

步驟7:調(diào)用Python函數(shù)

一旦成功創(chuàng)建Python元組對(duì)象作為函數(shù)參數(shù),我們可以調(diào)用一個(gè)帶參數(shù)的Python函數(shù)。為此,通過(guò)使用PyObject_GetAttrString首先獲得模塊中定義的函數(shù)的引用,然后使用PyObject_CallObject調(diào)用該函數(shù)。例如:

步驟8:錯(cuò)誤檢查

避免運(yùn)行時(shí)錯(cuò)誤的常見(jiàn)方法是檢查函數(shù)的返回值并根據(jù)返回值采取適當(dāng)?shù)男袆?dòng)。類似于C程序中的全局變量errno,Python/C API提供一個(gè)全局指示符,它報(bào)告最后發(fā)生的錯(cuò)誤。當(dāng)Python/C API函數(shù)失敗,全局指示符設(shè)置為指示錯(cuò)誤,并且PyErr_Print可以用于顯示相應(yīng)的人類可讀的trackback。例如:

在你的應(yīng)用程序中,你可以輕松地將各種錯(cuò)誤檢查。

這里是完整的C程序,它如本教程描述的嵌入Python代碼。

步驟9:編譯和執(zhí)行

保存以上代碼到finalCode.c,并且鏈接Python庫(kù)(-lpython2.7)編譯該代碼。根據(jù)發(fā)行版的不同,可能使用不同的版本(例如,-lpython2.6)。

c調(diào)用python訓(xùn)練模型,輸入怎么設(shè)置

可以使用Python的ctypes模塊來(lái)實(shí)現(xiàn)C和Python之間的通信,從而實(shí)現(xiàn)C調(diào)用Python訓(xùn)練模型的輸入。

ctypes模塊提供了一種調(diào)用共享庫(kù)的方法,可以將Python的變量和函數(shù)轉(zhuǎn)換為C語(yǔ)言的變量和函數(shù),從而實(shí)現(xiàn)C調(diào)用Python的功能。

要實(shí)現(xiàn)C調(diào)用Python訓(xùn)練模型的輸入,需要做的第一步是在C程序中定義一個(gè)Python函數(shù),并將其轉(zhuǎn)換為C函數(shù)。然后,可以使用ctypes模塊將Python函數(shù)轉(zhuǎn)換為C函數(shù),從而實(shí)現(xiàn)C調(diào)用Python訓(xùn)練模型的輸入。

分享名稱:c調(diào)用python函數(shù) python如何調(diào)用c++編寫(xiě)的代碼
文章起源:http://www.muchs.cn/article32/dosedsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、全網(wǎng)營(yíng)銷推廣企業(yè)網(wǎng)站制作、自適應(yīng)網(wǎng)站、營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作