成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

c函數(shù)注冊到python,注冊函數(shù)的功能

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

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

偏關(guān)ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

由于需要訪問Python/C API,首先安裝Python開發(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)用來設(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ù)來實現(xiàn)這。例如,轉(zhuǎn)換C字符串到Python字符串,使用PyString_FromString函數(shù)。

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

步驟4:定義一個Python模塊

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

為了進(jìn)行說明,我們實現(xiàn)一個簡單的Python模塊例子如下:

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

步驟5:加載一個Python模塊

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

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

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

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

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

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

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

步驟8:錯誤檢查

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

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

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

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

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

python調(diào)用c函數(shù)

Python是解釋性語言, 底層就是用c實現(xiàn)的, 所以用python調(diào)用C是很容易的, 下面就總結(jié)一下各種調(diào)用的方法, 給出例子, 所有例子都在ubuntu9.10, python2.6下試過

1. Python 調(diào)用 C (base)

想在python中調(diào)用c函數(shù), 如這兒的fact

#include Python.h

int fact(int n)

{

if (n = 1)

return 1;

else

return n * fact(n - 1);

}

PyObject* wrap_fact(PyObject* self, PyObject* args)

{

int n, result;

if (! PyArg_ParseTuple(args, "i:fact", n))

return NULL;

result = fact(n);

return Py_BuildValue("i", result);

}

static PyMethodDef exampleMethods[] =

{

{"fact", wrap_fact, METH_VARARGS, "Caculate N!"},

{NULL, NULL}

};

void initexample()

{

PyObject* m;

m = Py_InitModule("example", exampleMethods);

}

把這段代碼存為wrapper.c, 編成so庫,

gcc -fPIC wrapper.c -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config

然后在有此so庫的目錄, 進(jìn)入python, 可以如下使用

import example

example.fact(4)

2. Python 調(diào)用 C++ (base)

在python中調(diào)用C++類成員函數(shù), 如下調(diào)用TestFact類中的fact函數(shù),

#include Python.h

class TestFact{

public:

TestFact(){};

~TestFact(){};

int fact(int n);

};

int TestFact::fact(int n)

{

if (n = 1)

return 1;

else

return n * (n - 1);

}

int fact(int n)

{

TestFact t;

return t.fact(n);

}

PyObject* wrap_fact(PyObject* self, PyObject* args)

{

int n, result;

if (! PyArg_ParseTuple(args, "i:fact", n))

return NULL;

result = fact(n);

return Py_BuildValue("i", result);

}

static PyMethodDef exampleMethods[] =

{

{"fact", wrap_fact, METH_VARARGS, "Caculate N!"},

{NULL, NULL}

};

extern "C" //不加會導(dǎo)致找不到initexample

void initexample()

{

PyObject* m;

m = Py_InitModule("example", exampleMethods);

}

把這段代碼存為wrapper.cpp, 編成so庫,

g++ -fPIC wrapper.cpp -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config

然后在有此so庫的目錄, 進(jìn)入python, 可以如下使用

import example

example.fact(4)

3. Python 調(diào)用 C++ (Boost.Python)

Boost庫是非常強(qiáng)大的庫, 其中的python庫可以用來封裝c++被python調(diào)用, 功能比較強(qiáng)大, 不但可以封裝函數(shù)還能封裝類, 類成員.

首先在ubuntu下安裝boost.python, apt-get install libboost-python-dev

#include boost/python.hpp

char const* greet()

{

return "hello, world";

}

BOOST_PYTHON_MODULE(hello)

{

using namespace boost::python;

def("greet", greet);

}

把代碼存為hello.cpp, 編譯成so庫

g++ hello.cpp -o hello.so -shared -I/usr/include/python2.5 -I/usr/lib/python2.5/config -lboost_python-gcc42-mt-1_34_1

此處python路徑設(shè)為你的python路徑, 并且必須加-lboost_python-gcc42-mt-1_34_1, 這個庫名不一定是這個, 去/user/lib查

然后在有此so庫的目錄, 進(jìn)入python, 可以如下使用

import hello

hello.greet()

'hello, world'

4. python 調(diào)用 c++ (ctypes)

ctypes is an advanced ffi (Foreign Function Interface) package for Python 2.3 and higher. In Python 2.5 it is already included.

ctypes allows to call functions in dlls/shared libraries and has extensive facilities to create, access and manipulate simple and complicated C data types in Python - in other words: wrap libraries in pure Python. It is even possible to implement C callback functions in pure Python.

#include Python.h

class TestFact{

public:

TestFact(){};

~TestFact(){};

int fact(int n);

};

int TestFact::fact(int n)

{

if (n = 1)

return 1;

else

return n * (n - 1);

}

extern "C"

int fact(int n)

{

TestFact t;

return t.fact(n);

}

將代碼存為wrapper.cpp不用寫python接口封裝, 直接編譯成so庫,

g++ -fPIC wrapper.cpp -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config

進(jìn)入python, 可以如下使用

import ctypes

pdll = ctypes.CDLL('/home/ubuntu/tmp/example.so')

pdll.fact(4)

12

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

在C/C++中嵌入Python也比較簡單,首先需要在VC中添加Python的include文件目錄和lib文件目錄:

VC6.0下,打開 tools-options-directories-show directories for,將Python安裝目錄下的inlude目錄添加到inlude files項中,將libs目錄添加到library files項中。

VC2005下,打開tools-options-項目和解決方案-VC++目錄,然后做相同工作。

代碼如下:

//在debug下執(zhí)行出錯,“無法找到python31_d.lib文件”,后查到原因是:在debug下生成必須要有python31_d.lib文件,否則只能在release下生成

#include python.h

int main()

{

Py_Initialize();

PyRun_SimpleString("Print 'hi, python!'");

Py_Finalize();

return 0;

}

Py_Initialize函數(shù)原型是:void Py_Initialize(),在嵌入Python腳本時必須使用該函數(shù),它初始化Python解釋器,在使用其他的Python/C API之前必須先調(diào)用該函數(shù)。可以使用Py_IsInitialized函數(shù)判斷是否初始化成功,成功返回True。

PyRun_SimpleString函數(shù)原型是int PyRun_SimpleString(const char *command),用來執(zhí)行一段Python代碼。注意:是否需要維持語句間的縮進(jìn)呢?

Py_Finalize函數(shù)原型是void Py_Finalize(),用于關(guān)閉Python解釋器,釋放解釋器所占用的資源。

PyRun_SimpleFile函數(shù)可以用來運行".py"腳本文件,函數(shù)原型如下:

int PyRun_SimpleFile(FILE *fp, const char *filename);

其 中fp是打開的文件指針,filename是要運行的python腳本文件名。但是由于該函數(shù)官方發(fā)布的是由visual studio 2003.NET編譯的,如果使用其他版本的編譯器,F(xiàn)ILE定義可能由于版本原因?qū)е卤罎ⅰM瑫r,為簡便起見可以使用如下方式來代替該函數(shù):

PyRun_SimpleString("execfile(‘file.py’)"); //使用execfile來運行python文件

Py_BuildValue()用于對數(shù)字和字符串進(jìn)行轉(zhuǎn)換處理,變成Python中相應(yīng)的數(shù)據(jù)類型(在C語言中,所有Python類型都被聲明為PyObject類型),函數(shù)原型如下:

PyObject *Py_BuildValue(const char *format, …..);

PyString_String()用于將PyObject*類型的變量轉(zhuǎn)換成C語言可以處理的char*型,具體原型如下:

char* PyString_String(PyObject *p);

列表操作函數(shù):

PyObject * PyList_New(Py_ssize_t len);

int PyList_SetItem(PyObject *list, Py_ssize_t index, PyObject *item);

PyObject * PyList_GetItem(PyObject *list, Py_ssize_t index);

int PyList_Append(PyObject *list, PyObject *item);

int PyList_Sort(PyObject *list);

int PyList_Reverse(PyObject *list);

Py_ssize_t PyList_Size(PyObject *list);

元組操作函數(shù):

int PyTuple_New(Py_ssize_t len);

int PyTuple_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o);

PyObject * PyTuple_GetItem(PyObject *p, Py_ssize_t pos);

int _PyTuple_Resize(PyObject **p, Py_ssize_t newsize); //注意是**指針

字典操作函數(shù):

PyObject * PyDict_New();

int PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val);

int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val);

PyObject* PyDict_GetItem(PyObject *p, PyObject *key);

PyObject* PyDict_GetItemString(PyObject *p, const char *key);

//與PyDict_SetItemString對應(yīng)

int PyDict_DelItem(PyObject *p, PyObject *key);

int PyDict_DelItemString(PyObject *p, char *key);

//與PyDict_SetItemString對應(yīng)

int PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue);

PyObject* PyDict_Items(PyObject *p);

PyObject* PyDict_keys(PyObject *p);

PyObject* PyDict_Values(PyObject *p);

在C/C++中使用Python對象應(yīng)正確地處理引用計數(shù)問題,否則容易導(dǎo)致內(nèi)存泄漏。當(dāng)使用Python/C API中的函數(shù)創(chuàng)建列表、元組、字典等后,在對其完成操作后應(yīng)該使用Py_CLEAR()和Py_DECREF()等宏來銷毀這些對象。原型如下:

void Py_CLEAR(PyObject *o);

void Py_DECREF(PyObject *o);

其中,對于Py_CLEAR函數(shù),參數(shù)可以為NULL指針,表示不進(jìn)行任何操作,但是Py_DECREF函數(shù)不能為NULL指針,否則導(dǎo)致錯誤。

使用PyImport_Import()函數(shù)可以在C中導(dǎo)入Python模塊,返回一個模塊對象。函數(shù)原型為:

PyObject* PyImport_Import(PyObject *name);

PyModule_GetDict()函數(shù)可以獲得Python模塊中的函數(shù)列表,返回一個字典,字典中的關(guān)鍵字為函數(shù)名,值為函數(shù)的調(diào)用地址。原型如下:

PyObject* PyModule_GetDict(PyObject *module);

使用PyObject_CallObject()函數(shù)和PyObject_CallFunction()函數(shù)可以在C中調(diào)用Python中的函數(shù),原型如下:

PyObject* PyObject_CallObject(PyObject *callable_object, PyObject *args);

//args是元組形式

PyObject* PyObject_CallFunction(PyObject *callable, char *format, ……);

//format是類似”iss”這樣的參數(shù)類型,后面是指定參數(shù)

可以使用PyCallable_Check(func)來判斷是否可以調(diào)用函數(shù),可以則返回True。

C語言怎么轉(zhuǎn)化成python

要將C語言轉(zhuǎn)化為python,前提:

1

對C語言語法即python編程均熟練掌握;

2

對算法相關(guān)有一定了解;

3

至少可以看懂要轉(zhuǎn)換的C語言程序。

由于C語言的語句,與python沒有對應(yīng)關(guān)系,所以只能按照如下方式轉(zhuǎn)換:

1

讀懂C語言代碼實現(xiàn)功能,可以以函數(shù)為單位;

2

按照功能,依照python方式實現(xiàn)相同功能。

python怎樣嵌入c

用c語言編寫一個動態(tài)庫,提供兩個函數(shù),兩個數(shù)的整形求和,兩個浮點數(shù)的求和。取名為mylib.c。

將c函數(shù)文件編譯成so動態(tài)庫。運行g(shù)cc mylib.c -fPIC -shared -o libtest.so命令,在目錄下可以看到生成的庫文件libtest.so。

Python調(diào)用so庫文件。首先導(dǎo)入ctypes,其次用CDLL加載so文件,最后調(diào)用對應(yīng)的函數(shù)。將python代碼保存到pydemo.py中。

執(zhí)行python pydemo.py查看運行結(jié)果。

眾多python培訓(xùn)視頻,盡在python學(xué)習(xí)網(wǎng),歡迎在線學(xué)習(xí)!

網(wǎng)頁標(biāo)題:c函數(shù)注冊到python,注冊函數(shù)的功能
文章路徑:http://jinyejixie.com/article32/dssidpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、服務(wù)器托管、網(wǎng)站內(nèi)鏈軟件開發(fā)、域名注冊、企業(yè)網(wǎng)站制作

廣告

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

外貿(mào)網(wǎng)站建設(shè)
尉犁县| 安西县| 内丘县| 静安区| 马尔康县| 铁岭市| 肥西县| 长春市| 铁岭市| 酉阳| 商洛市| 中西区| 黔江区| 吉水县| 天津市| 始兴县| 慈溪市| 高雄市| 乡城县| 宁安市| 治县。| 昌江| 五大连池市| 旌德县| 天峻县| 浦江县| 北碚区| 托里县| 手机| 石台县| 长泰县| 南昌市| 夏津县| 松潘县| 白水县| 昌吉市| 筠连县| 新兴县| 全南县| 满洲里市| 班戈县|