c呼叫python記錄

2022-08-18 21:03:11 字數 4723 閱讀 2592

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

import

osdef

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 : 0

time : 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 火狐瀏覽器,虛擬機器環境下,模擬登陸是 控制滑鼠點選網頁指定位置,進入到輸入框中,控制鍵盤輸入賬號密碼,出現問題是 彈出的瀏覽器視窗中,自動輸入站好密碼,英文本元可以正常輸入,中文字元無法輸入,嘗試 手動接管後還是 無法輸入中文,後來 有換 系統...