Python是解釋性語言, 底層就是用c實現的, 所以用python調用C是很容易的, 下面就總結一下各種調用的方法, 給出例子, 所有例子都在ubuntu9.10, python2.6下試過
永康網站建設公司成都創新互聯公司,永康網站設計制作,有大型網站制作公司豐富經驗。已為永康1000多家提供企業網站建設服務。企業網站搭建\外貿網站建設要多少錢,請找那個售后服務好的永康做網站的公司定做!
1. Python 調用 C (base)
想在python中調用c函數, 如這兒的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庫的目錄, 進入python, 可以如下使用
import example
example.fact(4)
2. Python 調用 C++ (base)
在python中調用C++類成員函數, 如下調用TestFact類中的fact函數,
#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" //不加會導致找不到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庫的目錄, 進入python, 可以如下使用
import example
example.fact(4)
3. Python 調用 C++ (Boost.Python)
Boost庫是非常強大的庫, 其中的python庫可以用來封裝c++被python調用, 功能比較強大, 不但可以封裝函數還能封裝類, 類成員.
首先在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路徑設為你的python路徑, 并且必須加-lboost_python-gcc42-mt-1_34_1, 這個庫名不一定是這個, 去/user/lib查
然后在有此so庫的目錄, 進入python, 可以如下使用
import hello
hello.greet()
'hello, world'
4. python 調用 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
進入python, 可以如下使用
import ctypes
pdll = ctypes.CDLL('/home/ubuntu/tmp/example.so')
pdll.fact(4)
12
源文件的函數名?源文件是文件名就能理解,這個函數名不知道是想表達什么。
Python中提供了很多接口方便我們能夠靈活進行性能分析,包括cProfile模塊中的Profile類和pstat模塊中的Stats類。
--cprofile是一種確定性分析器,只測量CPU時間,并不關心內存的消耗情況和其他與內存相關聯的信息
--它是基于Isprof的用C語言實現的擴展應用,運行開銷比較合理,適合分析運行時間較長的程序
--enable(): 開始進行性能分析并收集數據
--disableI(): 停止性能分析
--create_stats(): 停止收集數據,并為已經收集的數據創建stats對象
--print_stats():創建stats對象并打印分析結果
--dump_stats(filename): 把當前性能分析的內容寫入文件filename中
--runcall(func, *args, **kwargs): 收集被調用函數func的性能分析信息
--用來分析cProfile輸出的文件內容
--pstas模塊為開發者提供了Stats類,可以讀取和操作stats文件
(Stats類可以接受stats文件名,也可以直接接受cProfile.Profile對象作為數據源。)
--strip_dirs(): 刪除報告中所有函數文件名的路徑信息
--dump_stats(filename): 把stats中的分析數據寫入文件(也可以寫成cProfile.Profile.dump_stats())
--sort_stats(*keys): 對報告列表進行排序,函數會一次按照傳入的參數排序
--reverse_order(): 逆反當前的排序
--print_stats(*restrictions): 把信息打印到標準輸出。*restrictions用于控制打印結果的形式,比如(10,1.0,".*.py.*")表示打印所有py文件的信息的前10行結果
--第一行表示運行這個函數一共使用0.043秒,執行了845次函數調用
--第二行表示結果是按什么順序排列的(這里表示按照調用次數來進行排列的)
--ncalls: 表示函數調用的次數(有兩個數值表示有遞歸調用,總調用次數/原生調用次數)
--tottime: 函數內部調用時間(不包括他自己調用的其他函數時間)
--percall: tottime/ncalls
--cumtime: 表示累計調用時間(函數執行玩的總時間),它包含了函數自己內部調用的函數時間
--filename:lineno(function): 函數所在的文件,行號,函數名稱
上面的函數do_cProfile(do=False, order='tottime')是一個帶參數的裝飾器,通過do的值來進行性能分析的開關控制,通過order的值來選擇輸出結果按照什么方式進行排序。
比如我們對函數A和函數B進行性能分析
如果不給裝飾器傳入參數的話就是默認的False和tottime
有些時候我們需要通過命令行將參數傳遞給腳本,C語言中有個getopt()方法,python中也有個類似的命令行參數解析方法getopt()。python也提供了比getopt()更簡潔的argparse方法。另外,sys模塊也可以實現簡單的參數解析,本文將對這3種命令行參數解析方法簡要介紹。
sys.argv是傳入的參數列表,sys.argv[0]是當前python腳本的名稱,sys.argv[1]表示第一個參數,以此類推。
命令行運行:
可以看到傳入的參數通過sys.argv來獲取,它就是一個參數列表。
python的getopt與C語言的的getopt()函數類似。相比于sys模塊,支持長參數和短參數,并對參數解析賦值。但它需要結合sys模塊進行參數解析,語法格式如下:
短參數為單個英文字母,如果必須賦值需要在后面加英文冒號( : ),長參數一般為字符串(相比短參數,更能說明參數含義),如果必須賦值需要在后面加等號( = )。
命令行運行:
注意:短參數(options)和長參數(long_options)不需要一一對應,可以任意順序,也可以只有短參數或者只有長參數。
argparse模塊提供了很多可以設置的參數,例如參數的默認值,幫助消息,參數的數據類型等。argparse類主要包括ArgumentParser、add_argument和parse_args三個方法。
下面介紹這三個函數的使用方法。
argparse默認提供了 -h | --help 參數:
命令行運行:
下面列出部分參數:
下面來添加參數:
命令行運行:
parse_args() 方法用于解析參數,在前面的示例代碼中使用parse_args方法來提取參數值,對于無效或者錯誤的參數會打印錯誤信息和幫助信息:
命令行運行:
本文介紹了Python的三種命令行參數解析方法sys.argv、getopt和argparse,可以根據自己的需要進行選擇,getopt和argparse兩種方法相比來說,建議選擇argparse,代碼量更少更簡潔。更詳細的使用方法參考官方文檔:
--THE END--
網頁題目:python解析c函數名 pythonc
文章分享:http://m.newbst.com/article4/doippie.html
成都網站建設公司_創新互聯,為您提供電子商務、全網營銷推廣、用戶體驗、微信公眾號、網站收錄、虛擬主機
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯