可以具體說一下是怎么調(diào)用的嗎,像我使用C/C++調(diào)用這個外部程序(例如Python程序)時,我是這么做的,通過命令行參數(shù)通信,給個模板,注意看我的注釋。
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比長陽網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式長陽網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋長陽地區(qū)。費用合理售后完善,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");
/*雖然我強烈認為命名上應(yīng)該不用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);
/*這里是一個關(guān)鍵點,python的運行目錄在你的PATH環(huán)境變量里有,如下圖最后一行*/
system(cmd);
return 0;
}
process.py:(部分內(nèi)容,主要是在process方法定義后面加一點東西)
def process(pic_dir,pic_name):
...#(這里的語句體(suite)不用改, 加上后面兩句就行)
from sys import argv
process(argv[1],argv[2])
OK完成
下面是一個例子:
首先是python的一個簡單函數(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語言
#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('./')");
// 導(dǎo)入hello.py模塊
PyObject *pmodule = PyImport_ImportModule("hello");
// 獲得函數(shù)xprint對象,并調(diào)用,輸出“hello world\n”
PyObject *pfunc = PyObject_GetAttrString(pmodule, "xprint");
PyObject_CallFunction(pfunc, NULL);
// 獲得類Hello并生成實例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
嵌入
與python的擴展相對,嵌入是把Python解釋器包裝到C的程序中。這樣做可以給大型的,單一的,要求嚴格的,私有的并且(或者)極其重要的應(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語句
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返回的對象轉(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語句
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ù)必須是元組(一個參數(shù)也是,否則會失?。。?!坑?。?/p>
pParm = Py_BuildValue("(ssss)", im_account, auth_code, im_uid, proxy_topic);
//調(diào)用python中的函數(shù)
reslt = (PyObject*)PyEval_CallObject(pFunc, pParm);
//將python返回的對象轉(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;
}
如果要在test.py中調(diào)用腳本func.py腳本
首先,兩個腳本文件要放在pythonpath下,其次在test.py腳本的開頭寫上import func,這樣就可以直接調(diào)用func中的函數(shù)方法了。
是因為你的模塊的路徑不對,必須先指定路徑 PyObject *sys = PyImport_ImportModule("sys"); PyObject *path = PyObject_GetAttrString(sys, "path"); PyList_Append(path, PyString_FromString(""));C中調(diào)用Python函數(shù),找不到模塊
可以的。
C中內(nèi)嵌Python
新建立一個工程,首先需要將工作目錄設(shè)置到Python-3.1.1PCbuild中,以獲取到動態(tài)庫,至于靜態(tài)庫的包含,Include目錄的指定,那自然也是少不了的。文件中需要包含Python.h文件,這也是必須的。
接口中
Py_Initialize();
Py_Finalize();
其他的根據(jù)需求,再引入相應(yīng)的python builder 即可