python是簡單的,python又是強大的。
剛接觸python的人都會有這麼乙個疑問:python到底有什麼用。不過要知道它能做什麼,還得先學會使用它。python的語法相當簡單,這裡有乙個教程:相信你一兩天就能對python輕車熟路。
我的大部分時間都是用c開發的,所以,在c中呼叫python是我比較關心的話題。看了一些網上前輩們的**大致上也有乙個整體的認識。
1. 設定編譯環境,其實就是設定python的標頭檔案和庫檔案目錄
2. 初始化python直譯器:
py_initialize();
3. 呼叫python
4. 釋放資源
py_finalize();
我們重點要說的是第三步,呼叫python。在c中,我們可以直接呼叫python的指令碼,也可以呼叫python中的函式。
1. 直接呼叫python腳步,可以使用函式:pyrun_******string()。
2. 呼叫python中的函式。關鍵問題是c中的型別怎麼傳遞到python中去,為此python提供了這樣的乙個函式:
pyobject* py_buildvalue(const char *format, ...);
pyobject* py_vabuildvalue(const char *format, va_list vargs );
這些函式的具體使用,可以參照python的說明。
這裡我實現了乙個函式來簡單的呼叫python中的函式:
1/*2module: python腳步的模組名
3function: 要呼叫的函式名
4format: 傳遞給py_vabuildvalue函式的可變引數模板5*/
6int
pycall(
const
char
*module,
const
char
*function,
const
char
*format, ... )717
//查詢函式
18if( !
(pfunc
=pyobject_getattrstring(pmod, function) ) )
2122
//建立引數
23va_list vargs;
24va_start( vargs, format );
25pparm
=py_vabuildvalue( format, vargs );
26va_end(vargs);
2728
//函式呼叫
29pretval
=pyeval_callobject( pfunc, pparm);
3031
//假定返回值為整形
32int
ret;
33pyarg_parse( pretval, "i
", &ret );
34return
ret;35}
3637
intmain(
intargc,
char
*argv)
38)", 2, "name", "linxr", "age", "25" );
46*/
47printf(
"ret = %d\n
", pycall(
"pytest",
"fun
", "()
");48printf(
"ret = %d\n
", pycall(
"pytest",
"fun1",
"(i)
",
12);
49printf(
"ret = %d\n
", pycall(
"pytest",
"fun2",
"(is)",
12, "12
");5051
py_finalize();
5253
return0;
54}
python呼叫C的函式
需要用到ctypes這個庫 官方文件 ctypes是python的乙個外部函式庫,它提供相容c的資料型別,允許呼叫dll或共享庫中的函式。它可以用純python來封裝這些庫 目前在pwn中使用過這個庫 在 guess num 這一題中,需要用棧溢位漏洞將srand的引數修改為自己的 引數,然後呼叫r...
python呼叫C函式
是的,我又開始integrate另乙個方法 此方法用c python作膠水,供matlab呼叫,原來是在linux上編譯執行,我需要把它在windows x64上跑起來 在linux平台,python呼叫c是通過這樣的方式來進行的 var cdll test.so 其中,so是linux上的一種稱為...
python 呼叫c語言函式
雖然python是萬能的,但是對於某些特殊功能,需要c語言才能完成。這樣,就需要用python來呼叫c的 了 具體流程 c編寫相關函式 編譯成庫 然後在python中載入這些庫,指定呼叫函式。這些函式可以char int,float,還能返回指標。以下示例 通過python呼叫c函式,返回 hell...