c調用python返回-九游会j9娱乐平台
㈠ c/c 調用python中返回值為list的函數
在c/c 中調用了這個函數之後不是會返回一個pyobject對象嗎?那個對象就是一個list啊,然後使用pylist_size()獲取它的大小,使用pylist_getitem()去讀取其中的元素就ok了啊。
找下python的c api manual,裡面這些函數的用法寫的很詳細的。
㈡ python c api浣跨敤鏃墮渶瑕佹敞鎰忎粈涔
涓錛氱敤c api涓篜ython鍐機璇璦鍑芥暟錛屼互鏂逛究python涓璋冪敤
1. 棣栧厛瀹炵幇涓涓鐗瑰畾鍘熷瀷鐨勫嚱鏁幫紝鐢≒ython c api鏉ュ疄鐜扮殑璇濓紝鎵鏈夊嚱鏁板繀欏繪槸榪欑嶅師鍨嬨傚繀欏繪槸綾諱技榪欐牱鐨
pyobject *fun(pyobject *self, pyobject *args)
self搴旇ユ槸鍦ㄧ敤綾葷殑鏃跺欐墠浼氱敤鍒幫紙鎴戞病鏈夌敤鍒幫級錛宎rgs灝辨槸鍑芥暟鐨勫弬鏁般傚洜涓篴rgs鏄涓涓狿yobject*綾誨瀷錛堝彲浠ヤ唬琛≒ython璇璦涓鐨勪換浣曠被鍨嬶級
2. 灝嗗弬鏁拌漿鎹㈡垚c 璇璦琛ㄧず鐨勫唴瀹癸紝鐢≒yarg_parsetuple鍑芥暟銆
3. 鎵ц屽畬闇瑕佺殑鎿嶄綔鍚庯紝涔熷繀欏昏繑鍥炰竴涓狿yobject*綾誨瀷鐨勫箋傞氳繃py_buildvalue鍑芥暟鏉ユ瀯寤恆
榪欓噷瑕佽寸殑鏄錛屽亣濡傚笇鏈涜繑鍥炰竴涓猅uple綾誨瀷鐨勫礆紝鍙浠ュ厛鐢
pyobject *tuple = py_buildvalue("(iis)", 1, 2, "three");
褰㈠紡鏉ユ瀯寤猴紝鍋囧傚緢澶氱殑璇濓紝鍙浠ョ敤涓嬮潰鐨勬柟寮忔潵鏋勫緩
pyobject *t;
t = pytuple_new(3);
pytuple_setitem(t, 0, pylong_fromlong(1l));
pytuple_setitem(t, 1, pylong_fromlong(2l));
pytuple_setitem(t, 2, pystring_fromstring("three"));
榪欎竴鐐瑰湪鍒氬紑濮嬪紑宸ョ殑鏃跺欒糠鎯戜簡寰堜箙銆
4. 灝嗚佽緭鍑虹殑鎵鏈夊嚱鏁版斁鍏ヤ竴涓鏁扮粍涓錛屾暟緇勭殑緇撴瀯鏄錛
struct pymethoddef {
const char *ml_name; /* the name of the built-in function/method */
pycfunction ml_meth; /* the c function that implements it */
int ml_flags; /* combination of meth_xxx flags, which mostly
describe the args expected by the c func */
const char *ml_doc; /* the __doc__ attribute, or null */
};
鏁扮粍浠{null, null}緇撴潫
5. 鏋勯犱竴涓狿ython import鏃跺垵濮嬪寲鐨勫嚱鏁
綾諱技
pymodinit_func
initexample(void)
{
py_initmole("example", example_methods);
}
榪欓噷鏈変釜鐗瑰埆闇瑕佹敞鎰忕殑鏄錛屽垵濮嬪寲鍑芥暟鍚嶅瓧鏈変弗鏍艱佹眰錛宨nit鍚庨潰蹇呴』璺熸ā鍧楀悕錛屽惁鍒橮ython鎵句笉鍒扮『瀹氱殑鍑芥暟浼氭姤娌℃湁鍒濆嬪寲鍑芥暟鐨勯敊璇
鎵╁睍妯″潡鍐欏畬鍚庯紝緙栬瘧鎴愬姩鎬佸簱錛圥ython瑕佹眰姝ゅ姩鎬佸簱鍚嶅瓧涓簆yd,瀹為檯灝辨槸鏀逛釜鍚庣紑鑰屽凡錛夈傚氨鍙浠ョ洿鎺ュ湪python鑴氭湰涓鐢╥mport鐨勬柟寮忓姞杞戒簡錛屽逛簬浣跨敤鏉ヨ達紝鏍規湰涓嶉渶瑕佺煡閬撴ゅ簱鏄鐢– api鎵╁睍鍐欑殑榪樻槸鐩存帴鐢≒ython璇鍙ュ啓鐨勶紙榪欑偣lua鍋氱殑涔熸槸涓鏍峰ソ錛
鏈鍚庯紝python鐨勬簮浠g爜涓闄勫甫浜嗕竴涓鍙鍋歟xample_nt鐨勪緥瀛愶紝鍙浠ュ弬鑰冧竴鏍鳳紝瀹屾暣鐨勬墿灞曚唬鐮佸備笅錛
#include "python.h"
static pyobject *
ex_foo(pyobject *self, pyobject *args)
{
printf("hello, world/n");
py_incref(py_none);
return py_none;
}
static pymethoddef example_methods[] = {
{"foo", ex_foo, meth_varargs, "foo() doc string"},
{null, null}
};
pymodinit_func
initexample(void)
{
py_initmole("example", example_methods);
}
浜岋紟c璇璦涓璋冪敤python璇鍙
棣栧厛錛寁oid py_initialize()鐢ㄦ潵鍒濆嬪寲錛寁oid py_finalize()鐢ㄦ潵緇撴潫python鐨勮皟鐢錛岃繖鏄蹇呴』瑕佺殑銆
鐕冪伀鍒嗕袱縐嶆儏鍐碉紝鍋囧備粎浠呮槸鍑犳潯璇鍙ョ殑璇濓紝閭d箞浠pyrun_涓哄墠緙鐨勪竴浜涘嚱鏁伴兘寰堝ソ鐢錛屾瘮濡
int pyrun_simplestring(const char *command)
鍑芥暟灝卞彲浠ョ洿鎺ユ墽琛屼竴鏉char*鐨凱ython璇鍙ャ
闇瑕佽幏寰楄繑鍥炲煎緱璇
pyobject* pyrun_string(const char *str, int start, pyobject *globals, pyobject *locals)
涔熷緢濂界敤錛屼互涓婁袱涓鍑芥暟鐢ㄦ潵澶勭悊python婧愪唬鐮佸凡緇忚誨叆鍐呭瓨鐨勬儏鍐碉紝鍦ㄦ枃浠朵腑鐨勬椂鍊
int pyrun_simplefile(file *fp, const char *filename)
pyobject* pyrun_file(file *fp, const char *filename, int start, pyobject *globals, pyobject *locals)
浣跨敤綾諱技銆備笉澶氳蹭簡銆
鍋囧傛槸涓妯″潡鐨勮瘽錛堟瘮濡備竴涓鍑芥暟錛夛紝甯屾湜鍦–璇璦涓璋冪敤鐨勮瘽閭d箞浣跨敤璧鋒潵灝辯◢寰澶嶆潅浜嗕竴鐐廣傝繖縐嶆儏鍐電殑闇瑕佸湪浜庝綘鍙浠ヤ粠c璇璦涓鍚慞ython鍑芥暟涓浼犲叆鍙傛暟騫朵笖鎵ц岋紝鐒跺悗鑾峰彇緇撴灉銆
姝ゅ勫張鍒嗕負鍑犵嶆儏鍐碉細
鍦ㄦ枃浠朵腑錛屽湪鍐呭瓨涓錛岀紪璇戣繃鐨勶紝婧愪唬鐮併
鍦ㄦ枃浠朵腑閮藉緢濂借в鍐籌紝鍜屼笂闈涓鏍楓傝繖閲屼富瑕佽插湪鍐呭瓨涓鐨勬儏鍐點傦紙浜嬪疄涓婃垜宸ヤ綔涓闇瑕佸苟涓旇楄垂浜嗗緢闀挎椂闂存墠鎵懼埌瑙e喅鏂規硶鐨勫氨鏄榪欑嶆儏鍐碉級
鏈緙栬瘧鏃訛細錛堜篃灝辨槸婧愪唬鐮侊級
1.閫氳繃
pyobject* py_compilestring(const char *str, const char *filename, int start)
api棣栧厛緙栬瘧涓嬈°傛api鐨勫弬鏁版垜璇存槑涓涓嬶紝str灝辨槸鍐呭瓨涓鐨勬簮浠g爜錛宖ilename涓昏佹槸鍑洪敊鏃舵姤閿欒鐢ㄧ殑錛屼簨瀹炴祴璇曡瘉鏄庯紝浣犻殢鎰忕粰涓瀛楃︿覆涔熸病鏈夊叧緋伙紝浣嗙粰null鍙傛暟鍦ㄨ繍琛屾椂蹇呯劧鎶ラ敊銆俿tart鎴戜竴鑸鐢ㄧ殑鏄疨y_file_input錛屽洜涓虹殑紜鏄浠庢枃浠朵腑璇誨彇榪囨潵鐨勶紝鐩稿圭殑榪樻湁py_single_input鐢ㄦ潵琛ㄧず涓鏉¤鍙ワ紝py_eval_input鐨勭敤娉曟垜涔熶笉鏄澶娓呮氥
婧愪唬鐮侀氳繃姝ゅ嚱鏁拌皟鐢ㄥ悗錛岃幏寰楃紪璇戝悗鐨凱yobject*,錛堝叾瀹炲亣濡傝窡榪涙簮浠g爜涓鍘葷湅錛屾槸涓涓狿ycodeobject緇撴瀯錛夊亣璁懼懡鍚嶄負lpcode銆
2.姝ゆ椂鍐嶈皟鐢ˋpi
pyobject* pyimport_execcodemole(char *name, pyobject *co)
瀵煎叆妯″潡銆傚弬鏁頒篃璇存槑涓涓嬶紝name涓哄煎叆鐨勬ā鍧楀悕錛宑o灝辨槸鍓嶉潰緙栬瘧榪囩殑浠g爜瀵硅薄錛坙pcode錛夈傝繑鍥炵殑灝辨槸妯″潡瀵硅薄浜嗭紝鍋囪懼懡鍚嶄負lpmod銆
3.鍐嶈皟鐢ˋpi
pyobject* pyobject_getattrstring(pyobject *o, const char *attr_name)
鑾峰緱鍑芥暟瀵硅薄銆俹灝辨槸妯″潡瀵硅薄錛坙pmod錛,attr_name灝辨槸浣犳兂瑕佽皟鐢ㄧ殑鍑芥暟鍚嶄簡錛屽亣璁懼彨main鐨勫嚱鏁幫紝灝辨槸鈥漨ain鈥濓紝鐒跺悗榪斿洖鐨勫氨鏄鍑芥暟瀵硅薄錛屽亣璁懼懡鍚嶄負lpfun銆
4.姝ゆ椂鍙浠ョ敤api
int pycallable_check(pyobject *o)
鍘繪鏌ヤ竴涓嬫槸涓嶆槸鑾峰緱浜嗕竴涓鍑芥暟銆傚亣濡傜『瀹氱殑璇濓紝灝卞彲浠ョ洿鎺ョ敤
pyobject_call寮澶寸殑涓鏃忓嚱鏁拌皟鐢╨pfun浜嗐傝繖浜涘嚱鏁板寘鎷寰堝氾紝涓鑸灝辨槸杈撳叆鍙傛暟鐨勪笉鍚岋紝浣嗘槸鏁堟灉閮芥槸涓鏍風殑錛屽氨鏄璋冪敤鍑芥暟鑰屽凡銆傚弬鏁頒竴鑸鍙浠ラ氳繃鍓嶉潰璇磋繃鐨刡uild鍑芥暟鏉ヨ幏寰楋紝榪斿洖鍊間篃鏄鑾峰緱涓涓狿yobject*,鍙浠ラ氳繃pyarg_閭d釜鍑芥暟鏉ヨ幏鍙栵紝浣嗘槸濂藉儚涓嶅お濂斤紝閭f槸鍒嗘瀽鍙傛暟鐢ㄧ殑銆傛帹鑽愮敤紜瀹氱被鍨嬶紙鍋囪句負type錛夌殑綾諱技py[type]_as鐨勫嚱鏁版潵鑾峰彇銆
姣斿傦細
long pylong_aslong(pyobject *pylong)鑾峰彇long
double pylong_asdouble(pyobject *pylong)鑾峰彇double
榪欓噷鎯寵寸殑鏄錛屽簲璇ユ湁鐩存帴浠庢簮浠g爜涓鑾峰彇鍑芥暟璋冪敤瀵硅薄鐨勬柟寮忥紝浣嗘槸鎴戞湰浜烘病鏈夎瘯鍑烘潵錛屾湁浜虹煡閬撹蜂竴瀹氳祼鏁欙紒
緙栬瘧榪囩殑浠g爜錛
瀵逛簬緙栬瘧榪囩殑浠g爜鍜屼笂闈㈠氨鏄鑾峰緱緙栬瘧鍚庣殑pycodeobject瀵硅薄,褰撶劧鍦ㄦ簮浠g爜涓琛ㄧず榪樻槸pyobject*鐨勬柟娉曚笉鍚岋紙涓婁緥涓鐨刲pcode錛夈
褰撶劧瑕佹兂浠ュ悗鑾峰緱涓涓緙栬瘧鍚庣殑lpcode,鑷鐒惰佸厛緙栬瘧涓涓嬪暒銆備絾鏄綰綺圭紪璇戞垚pyc緇撳熬鐨勬枃浠跺悗錛岀洿鎺ヨ誨叆鍐呭瓨錛屾垜娌℃湁鎵懼埌灝嗗叾杞鍖栦負pycodeobject瀵硅薄鐨勬柟娉曪紙涔熷笇鏈涙湁浜虹煡閬撹兘鍛婅瘔鎴戱紒錛
鎴戞壘鍒扮殑鏂規硶鏄鍏堢敤
pyobject* pymarshal_writeobjecttostring(pyobject *value, int version)
void pymarshal_writelongtofile(long value, file *file, int version)
涓や釜鍑芥暟鍏堟妸pycodeobject瀵硅薄(lpcode)搴忓垪鍖栧埌鏂囦歡鎴栬呭唴瀛樹腑銆
鍐嶅湪闇瑕佺殑鏃跺欑敤鍑芥暟
pyobject* pymarshal_readobjectfromfile(file *file)
pyobject* pymarshal_readobjectfromstring(char *string, py_ssize_t len)
璇誨嚭鏉ワ紝璇誨嚭鏉ョ殑pyobject*鍏跺疄灝辨槸鎯寵佺殑pycodeobject瀵硅薄浜(lpcode)銆傛帴涓嬫潵鐨勬ラや笌鏈緙栬瘧鏃剁殑姝ラや竴鏍楓
鍏夋槸榪欎釜鎵鏇茬殑鏂規硶鎴戣繕鏄鍙傝冭佹葷粰鐨勫崐杈硅祫鏂欏弽澶嶇爺絀跺嚭鏉ョ殑銆傝岀湡姝g洿鎺ユ湁鏁堢殑鏂規硶鎴戣繕鏄娌℃湁鎵懼埌銆
㈢ c語言中調用一個函數,被調用的函數只能有一個返回值
所謂函數,在離散數學里的定義就是具有單值性的關系。我用過c和python,他們的函數都是符合離散數學定義的,也就是說只有一個返回值。但是,c的函數可以返回指針,這就意味著你可以返回一個數組或者鏈表,相當於返回了多個值。
㈣ python return用法
return語句就是把執行結果返回到調用的地方,並把程序的控制權一起返回。
python解釋器易於擴展,可以使用c或c (或者其他可以通過c調用的語言)擴展新的功能和數據類型。python 也可用於可定製化軟體中的擴展程序語言。python豐富的標准庫,提供了適用於各個主要系統平台的源碼或機器碼。
2021年10月,語言流行指數的編譯器tiobe將python加冕為最受歡迎的編程語言,20年來首次將其置於java、c和javascript之上。
相關內容:
python專用的科學計算擴展庫就更多了,例如如下3個十分經典的科學計算擴展庫:numpy、scipy和matplotlib,它們分別為python提供了快速數組處理、數值運算以及繪圖功能。
因此python語言及其眾多的擴展庫所構成的開發環境十分適合工程技術、科研人員處理實驗數據、製作圖表,甚至開發科學計算應用程序。2018年3月,該語言作者在郵件列表上宣布python 2.7將於2020年1月1日終止支持。