Python是解釋性語(yǔ)言, 底層就是用c實(shí)現(xiàn)的, 所以用python調(diào)用C是很容易的, 下面就總結(jié)一下各種調(diào)用的方法, 給出例子, 所有例子都在ubuntu9.10, python2.6下試過(guò)
永康網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,永康網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為永康1000多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的永康做網(wǎng)站的公司定做!
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庫(kù),
gcc -fPIC wrapper.c -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config
然后在有此so庫(kù)的目錄, 進(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" //不加會(huì)導(dǎo)致找不到initexample
void initexample()
{
PyObject* m;
m = Py_InitModule("example", exampleMethods);
}
把這段代碼存為wrapper.cpp, 編成so庫(kù),
g++ -fPIC wrapper.cpp -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config
然后在有此so庫(kù)的目錄, 進(jìn)入python, 可以如下使用
import example
example.fact(4)
3. Python 調(diào)用 C++ (Boost.Python)
Boost庫(kù)是非常強(qiáng)大的庫(kù), 其中的python庫(kù)可以用來(lái)封裝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庫(kù)
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, 這個(gè)庫(kù)名不一定是這個(gè), 去/user/lib查
然后在有此so庫(kù)的目錄, 進(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庫(kù),
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
源文件的函數(shù)名?源文件是文件名就能理解,這個(gè)函數(shù)名不知道是想表達(dá)什么。
Python中提供了很多接口方便我們能夠靈活進(jìn)行性能分析,包括cProfile模塊中的Profile類和pstat模塊中的Stats類。
--cprofile是一種確定性分析器,只測(cè)量CPU時(shí)間,并不關(guān)心內(nèi)存的消耗情況和其他與內(nèi)存相關(guān)聯(lián)的信息
--它是基于Isprof的用C語(yǔ)言實(shí)現(xiàn)的擴(kuò)展應(yīng)用,運(yùn)行開銷比較合理,適合分析運(yùn)行時(shí)間較長(zhǎng)的程序
--enable(): 開始進(jìn)行性能分析并收集數(shù)據(jù)
--disableI(): 停止性能分析
--create_stats(): 停止收集數(shù)據(jù),并為已經(jīng)收集的數(shù)據(jù)創(chuàng)建stats對(duì)象
--print_stats():創(chuàng)建stats對(duì)象并打印分析結(jié)果
--dump_stats(filename): 把當(dāng)前性能分析的內(nèi)容寫入文件filename中
--runcall(func, *args, **kwargs): 收集被調(diào)用函數(shù)func的性能分析信息
--用來(lái)分析cProfile輸出的文件內(nèi)容
--pstas模塊為開發(fā)者提供了Stats類,可以讀取和操作stats文件
(Stats類可以接受stats文件名,也可以直接接受cProfile.Profile對(duì)象作為數(shù)據(jù)源。)
--strip_dirs(): 刪除報(bào)告中所有函數(shù)文件名的路徑信息
--dump_stats(filename): 把stats中的分析數(shù)據(jù)寫入文件(也可以寫成cProfile.Profile.dump_stats())
--sort_stats(*keys): 對(duì)報(bào)告列表進(jìn)行排序,函數(shù)會(huì)一次按照傳入的參數(shù)排序
--reverse_order(): 逆反當(dāng)前的排序
--print_stats(*restrictions): 把信息打印到標(biāo)準(zhǔn)輸出。*restrictions用于控制打印結(jié)果的形式,比如(10,1.0,".*.py.*")表示打印所有py文件的信息的前10行結(jié)果
--第一行表示運(yùn)行這個(gè)函數(shù)一共使用0.043秒,執(zhí)行了845次函數(shù)調(diào)用
--第二行表示結(jié)果是按什么順序排列的(這里表示按照調(diào)用次數(shù)來(lái)進(jìn)行排列的)
--ncalls: 表示函數(shù)調(diào)用的次數(shù)(有兩個(gè)數(shù)值表示有遞歸調(diào)用,總調(diào)用次數(shù)/原生調(diào)用次數(shù))
--tottime: 函數(shù)內(nèi)部調(diào)用時(shí)間(不包括他自己調(diào)用的其他函數(shù)時(shí)間)
--percall: tottime/ncalls
--cumtime: 表示累計(jì)調(diào)用時(shí)間(函數(shù)執(zhí)行玩的總時(shí)間),它包含了函數(shù)自己內(nèi)部調(diào)用的函數(shù)時(shí)間
--filename:lineno(function): 函數(shù)所在的文件,行號(hào),函數(shù)名稱
上面的函數(shù)do_cProfile(do=False, order='tottime')是一個(gè)帶參數(shù)的裝飾器,通過(guò)do的值來(lái)進(jìn)行性能分析的開關(guān)控制,通過(guò)order的值來(lái)選擇輸出結(jié)果按照什么方式進(jìn)行排序。
比如我們對(duì)函數(shù)A和函數(shù)B進(jìn)行性能分析
如果不給裝飾器傳入?yún)?shù)的話就是默認(rèn)的False和tottime
有些時(shí)候我們需要通過(guò)命令行將參數(shù)傳遞給腳本,C語(yǔ)言中有個(gè)getopt()方法,python中也有個(gè)類似的命令行參數(shù)解析方法getopt()。python也提供了比getopt()更簡(jiǎn)潔的argparse方法。另外,sys模塊也可以實(shí)現(xiàn)簡(jiǎn)單的參數(shù)解析,本文將對(duì)這3種命令行參數(shù)解析方法簡(jiǎn)要介紹。
sys.argv是傳入的參數(shù)列表,sys.argv[0]是當(dāng)前python腳本的名稱,sys.argv[1]表示第一個(gè)參數(shù),以此類推。
命令行運(yùn)行:
可以看到傳入的參數(shù)通過(guò)sys.argv來(lái)獲取,它就是一個(gè)參數(shù)列表。
python的getopt與C語(yǔ)言的的getopt()函數(shù)類似。相比于sys模塊,支持長(zhǎng)參數(shù)和短參數(shù),并對(duì)參數(shù)解析賦值。但它需要結(jié)合sys模塊進(jìn)行參數(shù)解析,語(yǔ)法格式如下:
短參數(shù)為單個(gè)英文字母,如果必須賦值需要在后面加英文冒號(hào)( : ),長(zhǎng)參數(shù)一般為字符串(相比短參數(shù),更能說(shuō)明參數(shù)含義),如果必須賦值需要在后面加等號(hào)( = )。
命令行運(yùn)行:
注意:短參數(shù)(options)和長(zhǎng)參數(shù)(long_options)不需要一一對(duì)應(yīng),可以任意順序,也可以只有短參數(shù)或者只有長(zhǎng)參數(shù)。
argparse模塊提供了很多可以設(shè)置的參數(shù),例如參數(shù)的默認(rèn)值,幫助消息,參數(shù)的數(shù)據(jù)類型等。argparse類主要包括ArgumentParser、add_argument和parse_args三個(gè)方法。
下面介紹這三個(gè)函數(shù)的使用方法。
argparse默認(rèn)提供了 -h | --help 參數(shù):
命令行運(yùn)行:
下面列出部分參數(shù):
下面來(lái)添加參數(shù):
命令行運(yùn)行:
parse_args() 方法用于解析參數(shù),在前面的示例代碼中使用parse_args方法來(lái)提取參數(shù)值,對(duì)于無(wú)效或者錯(cuò)誤的參數(shù)會(huì)打印錯(cuò)誤信息和幫助信息:
命令行運(yùn)行:
本文介紹了Python的三種命令行參數(shù)解析方法sys.argv、getopt和argparse,可以根據(jù)自己的需要進(jìn)行選擇,getopt和argparse兩種方法相比來(lái)說(shuō),建議選擇argparse,代碼量更少更簡(jiǎn)潔。更詳細(xì)的使用方法參考官方文檔:
--THE END--
網(wǎng)頁(yè)題目:python解析c函數(shù)名 pythonc
文章分享:http://redsoil1982.com.cn/article4/doippie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、全網(wǎng)營(yíng)銷推廣、用戶體驗(yàn)、微信公眾號(hào)、網(wǎng)站收錄、虛擬主機(jī)
聲明:本網(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)
營(yíng)銷型網(wǎng)站建設(shè)知識(shí)