當前位置:首頁 » 編程語言 » pythonapi教程

pythonapi教程

發布時間: 2024-08-16 02:45:24

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洿鎺ユ湁鏁堢殑鏂規硶鎴戣繕鏄娌℃湁鎵懼埌銆

Ⅱ python如何導入第三方依賴包API

第一種基本安裝方法
1 下載第三方包,解壓
2 在命令提示符里輸入cmd,然後用cd進入到第三方包的路徑下
3 輸入python setup.py build
4 輸入python setup.py install
看到包內的文件在安裝即可……

第二種 用pip安裝

pip可以很方便的安裝、卸載和管理Python的包。
pip install xxxx
第三種 直接安裝anaconda3,大部分常用依賴包都已經有了。

Ⅲ 如何通過python調用新浪微博的API

1.下載SDK

使用python調用API的話,首先要去下一個Python的SDK,sinaweibopy

連接地址在此: http://michaelliao.github.com/sinaweibopy/

可以使用pip很快的導入,github連接里的wiki也有入門的使用方法,很容易看懂。

2.理解新浪微博的授權機制

在調用API之前,首先要搞懂什麼叫OAuth 2,即新浪微博的授權機制,

連接在此: http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E

3.在新浪微博注冊應用

每個人都可以通過新浪微博開發者平台注冊自己的應用,我注冊的是站內應用。注冊後會為每個應用分配唯一的app key 和 app secret,這在上文提到的授權機制中需要用到,相當與每個應用的標示吧。

至此,我們可以嘗試寫代碼調用新浪微博的API啦。

4.簡單的調用API實例

參考了往上很多資料和文檔,寫了一個簡單的調用過程。

# _*_ coding: utf-8 _*_
from weibo import APIClient
import webbrowser
APP_KEY = 」
APP_SECRET = 」
CALLBACK_URL = 」
#這個是設置回調地址,必須與那個」高級信息「里的一致
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)
url = client.get_authorize_url()
# TODO: redirect to url
#print url
webbrowser.open_new(url)
# 獲取URL參數code:
code = 『『
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL)
r = client.request_access_token(code)
access_token = r.access_token # 新浪返回的token,類似abc123xyz456
expires_in = r.expires_in # token過期的UNIX時間:http://zh.wikipedia.org/wiki/UNIX%E6%97%B6%E9%97%B4
# TODO: 在此可保存access token
client.set_access_token(access_token, expires_in)

print client.friendships.friends.bilateral.ids.get(uid = 12345678)

通過以上的代碼,我實現了調用相互關注API的調用,即查找與某個id的用戶相互關注的人的列表。

其中,APP_KEY和APP_SECRET就是前文中分配給每個應用的信息,回調地址在每個應用的高級信息中可以看到,需要自己設置,不過隨便設置一下就好

比較惡心的是code的獲取,我一開始看sinaweibopy的文檔的時候也沒弄懂是什麼意思,如上面的代碼所示,url得到的是一個授權的網址,我們通過

webbrowser.open_new(url)
這行代碼打開瀏覽器跳轉到授權的界面,然後觀察所在界面的網址,會顯示大概如下一樣的格式:

http://apps.weibo.com/sayarywei?code=

看到了嗎?
問號後面有一個code=……的一個東西,把等號後面的字元串拷貝下來賦給code就可以了,但是每次運行程序是code不是一成不變的,也就是說每次都
要有這么一個手動獲取的過程,我覺得很麻煩,以後自己再研究一下,實現自動獲取code就好了。如果能有哪位大神告訴我,感激不盡~

好了,得到正確的code之後就可以完成授權認證,也就可以調用微博的API啦,至於如何在Python下調用,我拷貝一下sinaweibopy上的介紹:

首先查看新浪微博API文檔,例如:

API:statuses/user_timeline

請求格式:GET

請求參數:

source:string,採用OAuth授權方式不需要此參數,其他授權方式為必填參數,數值為應用的AppKey?。

access_token:string,採用OAuth授權方式為必填參數,其他授權方式不需要此參數,OAuth授權後獲得。

uid:int64,需要查詢的用戶ID。

screen_name:string,需要查詢的用戶昵稱。

(其它可選參數略)

調用方法:將API的「/」變為「.」,根據請求格式是GET或POST,調用get ()或post()並傳入關鍵字參數,但不包括source和access_token參數:

r = client.statuses.user_timeline.get(uid=123456)
for st in r.statuses:
print st.text

若為POST調用,則示例代碼如下:

r = client.statuses.update.post(status=u'測試OAuth 2.0發微博')

若需要上傳文件,傳入file-like object參數,示例代碼如下:

f = open('/Users/michael/test.png', 'rb')
r = client.statuses.upload.post(status=u'測試OAuth 2.0帶圖片發微博', pic=f)
f.close() # APIClient不會自動關閉文件,需要手動關閉

請注意:上傳的文件必須是file-like object,不能是str,因為無法區分一個str是文件還是欄位。可以通過StringIO把一個str包裝成file-like object。

熱點內容
上傳醫保局 發布:2024-11-25 14:57:00 瀏覽:731
刀劍神域緩存 發布:2024-11-25 14:56:07 瀏覽:519
c語言計算機二級編程題 發布:2024-11-25 14:46:49 瀏覽:311
c語言判斷進程是否存在 發布:2024-11-25 14:42:50 瀏覽:272
大數據緩存 發布:2024-11-25 14:29:07 瀏覽:435
存儲體與MAR 發布:2024-11-25 14:23:08 瀏覽:282
電腦瀏覽器怎麼取消配置文件 發布:2024-11-25 14:20:39 瀏覽:163
如何消除伺服器數據傳輸瓶頸 發布:2024-11-25 14:08:48 瀏覽:288
安卓開發程序如何上傳到手機上 發布:2024-11-25 14:08:30 瀏覽:28
訪客qq獲取系統源碼 發布:2024-11-25 14:08:30 瀏覽:17