c呼叫python的例項。
1. 應用場景
c**中需要資料庫的支援,但是引入資料庫十分的複雜且麻煩,所以考慮用python讀取配置檔案,然後將資料返回到c。
2.呼叫步驟
a, 新增必要的巨集和python路徑
#define ms_no_coredll#include"c:\python27\include\python.h
"#pragma comment(lib, "c:\\python27\\libs\\python27.lib")
b,初始化python直譯器
py_initialize();if ( !py_isinitialized() )
c,將python檔案的字串轉換為python字元,並匯入python檔案。
/*create python string symbol, s stand for string and pytest stand for pytest.py
*/pname = py_buildvalue( "
s", "
pytest");
/*import the python file.
*/pmodule =pyimport_import( pname );
if ( !pmodule )
d,匯入python檔案中的處理函式
pdict =pymodule_getdict( pmodule );if ( !pdict )
pfunc =pydict_getitemstring( pdict, functionname );
if ( !pycallable_check( pfunc ) )
e,傳入引數,入參型別為tuple.pytuple_new( 1 )產生乙個tuple,有1個元素。py_buildvalue( "i", 1 )將數字1轉換為python的整形型別。pyobject_callobject()呼叫執行函式執行。
pargs = pytuple_new( 1); pytuple_setitem( pargs,
0, py_buildvalue( "
i", 1
) );
pretval = pyobject_callobject( pfunc, pargs );
f,py_decref清除並釋放資源。
g,py_finalize()釋放python狀態機。
完整的**如下,需要在同目錄下建立test.txt檔案,保證資料的存在。
textcpython.c
#include #include#define ms_no_coredll#include
"c:\python27\include\python.h
"#pragma comment(lib, "c:\\python27\\libs\\python27.lib")
intreadfile()
/*create python string symbol, s stand for string and pytest stand for pytest.py
*/pname = py_buildvalue( "
s", "
pytest");
/*import the python file.
*/pmodule =pyimport_import( pname );
if ( !pmodule )
pdict =pymodule_getdict( pmodule );
if ( !pdict )
pfunc =pydict_getitemstring( pdict, functionname );
if ( !pycallable_check( pfunc ) )
pargs = pytuple_new( 1
); pytuple_setitem( pargs,
0, py_buildvalue( "
i", 1
) );
pretval =pyobject_callobject( pfunc, pargs );
printf(
"%s\n
", pystring_asstring( pydict_getitemstring( pretval, "
tupleno
") ) );
printf(
"%s\n
", pystring_asstring( pydict_getitemstring( pretval, "
ringprofile
") ) );
printf(
"%s\n
", pystring_asstring( pydict_getitemstring( pretval, "id"
) ) );
printf(
"%s\n
", pystring_asstring( pydict_getitemstring( pretval, "
time
") ) );
printf(
"%s\n
", pystring_asstring( pydict_getitemstring( pretval, "
on1"
) ) );
printf(
"%s\n
", pystring_asstring( pydict_getitemstring( pretval, "
off1
") ) );
printf(
"%s\n
", pystring_asstring( pydict_getitemstring( pretval, "
on2"
) ) );
printf(
"%s\n
", pystring_asstring( pydict_getitemstring( pretval, "
off2
") ) );
printf(
"%s\n
", pystring_asstring( pydict_getitemstring( pretval, "
on3"
) ) );
printf(
"%s\n
", pystring_asstring( pydict_getitemstring( pretval, "
off3
") ) );
printf(
"%s\n
", pystring_asstring( pydict_getitemstring( pretval, "
on4"
) ) );
printf(
"%s\n
", pystring_asstring( pydict_getitemstring( pretval, "
off4
") ) );
printf(
"%s\n
", pystring_asstring( pydict_getitemstring( pretval, "
on5"
) ) );
printf(
"%s\n
", pystring_asstring( pydict_getitemstring( pretval, "
off5
") ) );
py_decref( pname );
py_decref( pdict );
py_decref( pargs );
py_decref( pmodule );
py_finalize();
return1;
}int
main()
return0;
}
pytest.py
importosdef
getlistfromline( str ):
itemlist = [ li.replace( '
', '' ) for li in str.split( ':'
) ]
return [ li.replace( '
\n', '' ) for li in
itemlist ]
defgetfilecontent( id ):
f = open( '
test.txt')
try:
retval =
for line in
f.readlines():
if line != '\n'
:
return
dict( retval )
finally
: f.close()
test.txt
tupleno: 1ringprofile : 1id : 0time : 12000on1 : 100off1 : 400on2 : 0
off2 : 0
on3 : 0
off3 : 0
on4: 0
off4 : 0
on5 : 0
off5 : 0
Python呼叫C函式學習記錄
將.c檔案編譯成.so檔案 python中呼叫.so檔案 設現有test.c和test.h檔案,在命令列中輸入 an highlighted block gcc o testlib.so shared fpic test.c匯入.so檔案 an highlighted block import ct...
Python 函式呼叫效能記錄
之前用 js 寫專案的時候,專案組用的元件模式,一直感覺很不錯。最近用 python 做新專案,專案結構也延續了元件模式。一直沒有對函式呼叫的效能作了解,今天突發奇想測試了一下,寫了一些測試 首先定義了幾個 class class a object deftest self pass class b...
flask 呼叫 python爬蟲 記錄
過程 爬蟲問題 後來呼叫 模擬登陸,selenium 火狐瀏覽器,虛擬機器環境下,模擬登陸是 控制滑鼠點選網頁指定位置,進入到輸入框中,控制鍵盤輸入賬號密碼,出現問題是 彈出的瀏覽器視窗中,自動輸入站好密碼,英文本元可以正常輸入,中文字元無法輸入,嘗試 手動接管後還是 無法輸入中文,後來 有換 系統...