下面是一個(gè)例子:
成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)公司,提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司,網(wǎng)頁(yè)設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);可快速的進(jìn)行網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,是專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
首先是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);
// 獲得類(lèi)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
在C/C++中調(diào)用了這個(gè)函數(shù)之后不是會(huì)返回一個(gè)PyObject對(duì)象嗎?那個(gè)對(duì)象就是一個(gè)List啊,然后使用PyList_Size()獲取它的大小,使用PyList_GetItem()去讀取其中的元素就ok了啊。
找下Python的C API Manual,里面這些函數(shù)的用法寫(xiě)的很詳細(xì)的。
可以具體說(shuō)一下是怎么調(diào)用的嗎,像我使用C/C++調(diào)用這個(gè)外部程序(例如Python程序)時(shí),我是這么做的,通過(guò)命令行參數(shù)通信,給個(gè)模板,注意看我的注釋。
C的部分(用C++也行,不過(guò)不難,也不是重點(diǎn)):
#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");
/*雖然我強(qiáng)烈認(rè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);
/*這里是一個(gè)關(guān)鍵點(diǎn),python的運(yùn)行目錄在你的PATH環(huán)境變量里有,如下圖最后一行*/
system(cmd);
return 0;
}
process.py:(部分內(nèi)容,主要是在process方法定義后面加一點(diǎn)東西)
def process(pic_dir,pic_name):
...#(這里的語(yǔ)句體(suite)不用改, 加上后面兩句就行)
from sys import argv
process(argv[1],argv[2])
OK完成
C語(yǔ)言不能直接調(diào)用Python源程序,但是可以通過(guò)進(jìn)程調(diào)用來(lái)實(shí)現(xiàn)。