pythonapi教程
Ⅰ 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。