免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

python解析c函數名 pythonc

python調用c函數

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解析獲取C源文件的函數名

源文件的函數名?源文件是文件名就能理解,這個函數名不知道是想表達什么。

Python通過裝飾器并使用cprofile對函數進行性能分析

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

Python筆記:命令行參數解析

有些時候我們需要通過命令行將參數傳遞給腳本,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。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都seo排名網站優化