python可以直接调用win32的api吗1、说明
python可以调用win32的Apipython的api函数,是使用ctypes模块就可以调用win32的API函数 。
2、示例代码
import ctypes
MessageBox = ctypes.windll.user32.MessageBoxW
MessageBox(None, 'python的api函数我是python,我使用了win32 API :)', '提示', 0)
3、执行结果
4、注意事项
要注意函数使用的参数,如果使用了带中文的字符串,就是使用api中Unicode的函数,如上例中使用的MessageBoxW,如为纯ANSI编码字符串则直接使用MessageBox即可 。
python调用ctwing的api下发命令调用API函数使用ctypes的windll对象下发命令可实现调用API函数的功能 。API是用于构建应用程序软件的一组子程序定义,协议和工具 。一般来说,这是一套明确定义的各种软件组件之间的通信方法 。
Python C API使用时需要注意什么一:用C API为Python写C语言函数 , 以方便Python中调用
1.首先实现一个特定原型的函数,用Python C API来实现的话 , 所有函数必须是这种原型 。必须是类似这样的
PyObject *Fun(PyObject *self, PyObject *args)
self应该是在用类的时候才会用到(我没有用到),args就是函数的参数 。因为args是一个PyObject*类型(可以代表Python语言中的任何类型)
2.将参数转换成C 语言表示的内容,用PyArg_ParseTuple函数 。
3.执行完需要的操作后 , 也必须返回一个PyObject*类型的值 。通过Py_BuildValue函数来构建 。
这里要说的是,假如希望返回一个Tuple类型的值,可以先用
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 */
PyCFunctionml_meth;/* The C function that implements it */
【python的api函数 python中的api】intml_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.构造一个Python import时初始化的函数
类似
PyMODINIT_FUNC
initexample(void)
{
Py_InitModule("example", example_methods);
}
这里有个特别需要注意的是,初始化函数名字有严格要求,init后面必须跟模块名 , 否则Python找不到确定的函数会报没有初始化函数的错误
扩展模块写完后 , 编译成动态库(Python要求此动态库名字为pyd,实际就是改个后缀而已) 。就可以直接在Python脚本中用import的方式加载了,对于使用来说,根本不需要知道此库是用C API扩展写的还是直接用Python语句写的(这点Lua做的也是一样好)
最后,python的源代码中附带了一个叫做example_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_InitModule("example", example_methods);
}
二.C语言中调用Python语句
首先,void Py_Initialize()用来初始化,void Py_Finalize()用来结束Python的调用,这是必须要的 。
燃火分两种情况,假如仅仅是几条语句的话,那么以PyRun_为前缀的一些函数都很好用,比如
int PyRun_SimpleString(const char *command)
函数就可以直接执行一条char*的Python语句 。
需要获得返回值得话
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)
使用类似 。不多讲了 。
假如是个模块的话(比如一个函数),希望在C语言中调用的话那么使用起来就稍微复杂了一点 。这种情况的需要在于你可以从C语言中向Python函数中传入参数并且执行,然后获取结果 。
此处又分为几种情况:
在文件中,在内存中,编译过的,源代码 。
在文件中都很好解决,和上面一样 。这里主要讲在内存中的情况 。(事实上我工作中需要并且耗费了很长时间才找到解决方法的就是这种情况)
未编译时:(也就是源代码)
1.通过
PyObject* Py_CompileString(const char *str, const char *filename, int start)
API首先编译一次 。此API的参数我说明一下,str就是内存中的源代码,filename主要是出错时报错误用的,事实测试证明,你随意给个字符串也没有关系 , 但给NULL参数在运行时必然报错 。start我一般用的是Py_file_input,因为的确是从文件中读取过来的,相对的还有Py_single_input用来表示一条语句,Py_eval_input的用法我也不是太清楚 。
源代码通过此函数调用后,获得编译后的PyObject*,(其实假如跟进源代码中去看,是一个PyCodeObject结构)假设命名为lpCode 。
2.此时再调用API
PyObject* PyImport_ExecCodeModule(char *name, PyObject *co)
导入模块 。参数也说明一下,name为导入的模块名 , co就是前面编译过的代码对象(lpCode) 。返回的就是模块对象了 , 假设命名为lpMod 。
3.再调用API
PyObject* PyObject_GetAttrString(PyObject *o, const char *attr_name)
获得函数对象 。o就是模块对象(lpMod),attr_name就是你想要调用的函数名了 , 假设叫main的函数,就是”main”,然后返回的就是函数对象,假设命名为lpFun 。
4.此时可以用API
int PyCallable_Check(PyObject *o)
去检查一下是不是获得了一个函数 。假如确定的话,就可以直接用
PyObject_Call开头的一族函数调用lpFun了 。这些函数包括很多,一般就是输入参数的不同,但是效果都是一样的,就是调用函数而已 。参数一般可以通过前面说过的build函数来获得,返回值也是获得一个PyObject*,可以通过PyArg_那个函数来获?。?但是好像不太好,那是分析参数用的 。推荐用确定类型(假设为type)的类似Py[type]_As的函数来获取 。
比如:
long PyLong_AsLong(PyObject *pylong)获取long
double PyLong_AsDouble(PyObject *pylong)获取double
这里想说的是 , 应该有直接从源代码中获取函数调用对象的方式,但是我本人没有试出来,有人知道请一定赐教!
编译过的代码:
对于编译过的代码和上面就是获得编译后的PyCodeObject对象,当然在源代码中表示还是PyObject*的方法不同(上例中的lpCode) 。
当然要想以后获得一个编译后的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) 。接下来的步骤与未编译时的步骤一样 。
光是这个扭曲的方法我还是参考老总给的半边资料反复研究出来的 。而真正直接有效的方法我还是没有找到 。
Python数据库API(DB API)虽然 Python 需要为操作不同python的api函数的数据库使用不同的模块python的api函数,但不同的数据库模块并非没有规律可循,因为它们基本都遵守 Python 制订的 DB API 协议 , 目前该协议的最新版本是 2.0,因此这些数据库模块有很多操作其实都是相同的 。下面先介绍不同数据库模块之间的通用内容 。
全局变量
Python 推荐支持 DB API 2.0 的数据库模块都应该提供如下 3 个全局变量python的api函数:
apilevel:该全局变量显示数据库模块的 API 版本号 。对于支持 DB API 2.0 版本的数据库模块来说,该变量值通常就是 2.0 。如果这个变量不存在 , 则可能该数据库模块暂时不支持 DB API 2.0 。读者应该考虑选择使用支持该数据库的其python的api函数他数据库模块 。
threadsafety:该全局变量指定数据库模块的线程安全等级,该等级值为 0~3 ,其中 3 代表该模块完全是线程安全的;1 表示该模块具有部分线程安全性,线程可以共享该模块,但不能共享连接;0 则表示线程完全不能共享该模块 。
paramstyle:该全局变量指定当 SQL 语句需要参数时,可以使用哪种风格的参数 。该变量可能返回如下变量值:
format:表示在 SQL 语句中使用 Python 标准的格式化字符串代表参数 。例如,在程序中需要参数的地方使用 %s,接下来程序即可为这些参数指定参数值 。
pyformat:表示在 SQL 语句中使用扩展的格式代码代表参数 。比如使用 %(name) , 这样即可使用包含 key 为 name 的字典为该参数指定参数值 。
qmark:表示在 SQL 语句中使用问号(?)代表参数 。在 SQL 语句中有几个参数,全部用问号代替 。
numeric:表示在 SQL 语句中使用数字占位符(:N)代表参数 。例如:1 代表一个参数 , :2 也表示一个参数,这些数字相当于参数名,因此它们不一定需要连续 。
named:表示在 SQL 语句中使用命名占位符(:name)代表参数 。例如 :name 代表一个参数 , :age 也表示一个参数 。
通过查阅这些全局变量,即可大致了解该数据库 API 模块的对外的编程风格,至于该模块内部的实现细节,完全由该模块实现者负责提供,通常不需要开发者关心 。
数据库 API 的核心类
遵守 DB API 2.0 协议的数据库模块通常会提供一个 connect() 函数,该函数用于连接数据库,并返回数据库连接对象 。
数据库连接对象通常会具有如下方法和属性:
cursor(factory=Cursor):打开游标 。
commit():提交事务 。
rollback():回滚事务 。
close():关闭数据库连接 。
isolation_level:返回或设置数据库连接中事务的隔离级别 。
in_transaction:判断当前是否处于事务中 。
上面第一个方法可以返回一个游标对象,游标对象是 Python DB API 的核心对象,该对象主要用于执行各种 SQL 语句,包括 DDL、DML、select 查询语句等 。使用游标执行不同的 SQL 语句返回不同的数据 。
游标对象通常会具有如下方法和属性:
execute(sql[, parameters]):执行 SQL 语句 。parameters 参数用于为 SQL 语句中的参数指定值 。
executemany(sql, seq_of_parameters):重复执行 SQL 语句 。可以通过 seq_of_parameters 序列为 SQL 语句中的参数指定值,该序列有多少个元素,SQL 语句被执行多少次 。
executescript(sql_script):这不是 DB API 2.0 的标准方法 。该方法可以直接执行包含多条 SQL 语句的 SQL 脚本 。
fetchone():获取查询结果集的下一行 。如果没有下一行,则返回 None 。
fetchmany(size=cursor.arraysize):返回查询结果集的下 N 行组成的列表 。如果没有更多的数据行,则返回空列表 。
fetchall():返回查询结果集的全部行组成的列表 。
close():关闭游标 。
rowcount:该只读属性返回受 SQL 语句影响的行数 。对于 executemany() 方法,该方法所修改的记录条数也可通过该属性获取 。
lastrowid:该只读属性可获取最后修改行的 rowid 。
arraysize:用于设置或获取 fetchmany() 默认获取的记录条数,该属性默认为 1 。有些数据库模块没有该属性 。
description:该只读属性可获取最后一次查询返回的所有列的信息 。
connection:该只读属性返回创建游标的数据库连接对象 。有些数据库模块没有该属性 。
总结来看,Python 的 DB API 2.0 由一个 connect() 开始,一共涉及数据库连接和游标两个核心 API 。它们的分工如下:
数据库连接:用于获取游标、控制事务 。
游标:执行各种 SQL 语句 。
掌握了上面这些 API 之后 , 接下来可以大致归纳出 Python DB API 2.0 的编程步骤 。
操作数据库的基本流程
使用 Python DB API 2.0 操作数据库的基本流程如下:
调用 connect() 方法打开数据库连接,该方法返回数据库连接对象 。
通过数据库连接对象打开游标 。
使用游标执行 SQL 语句(包括 DDL、DML、select 查询语句等) 。如果执行的是查询语句 , 则处理查询数据 。
关闭游标 。
关闭数据库连接 。
下图显示了使用 Python DB API 2.0 操作数据库的基本流程 。
Python API快餐教程(1) - 字符串查找API字符串是7种序列类型中的一种 。
除了序列的操作函数,比如len()来求字符串长度之外 , Python还为字符串提供丰富到可以写个编辑器的API.
首先,下面的查找API都是为了查找位置,或者查一共有几次这样的操作 。
如果只是想判断一个字符串是不是另一个字符串的子串的话,使用序列的in运算符就可以了 。
例:
原型:str.count(sub[, start[, end]])
字符串的count函数可以数出来有多少次匹配 , 我们看个例子,有5个ha和3个hei
输出为5和2.
haha只能匹配两次 。
再加上扩展参数:
find函数的行为是,如果能找到 , 则返回在序列中的坐标,如果找不到,则返回-1. rfind是从右向左查找 。我们来看例子:
输出值为0和6.
找不到的例子:
输出值都是-1.
完整形式:
index和rindex的功能与find和rfind基本上一致 , 除了在找不到时会抛出ValueError异常而不是返回-1.
例:
所以我们需要加try...except语句来处理之:
有时候,我们希望做从头匹配或者匹配尾部 。这时候就要用到startswith函数和endswith函数 。例:
这两个返回值均为True.
如果需要更复杂的匹配 , 还是需要正则表达式 。与Java等语言不同,Python中的正则表达式有专门的模块,字符串的API不负责这个事情 。
关于python的api函数和python中的api的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 新媒体如何通过大数据,新媒体如何通过大数据传播
- theshy恋爱养成游戏的简单介绍
- mysql怎么修改编码 如何修改mysql编码
- 电脑怎么不读取u盘,电脑不读取u盘怎么设置
- 有什么机甲网络游戏,曾经火的机甲网游
- 电脑如何用可画制作PPT,可画电脑版
- go语言程序设计怎么样 go语言程序设计怎么样啊
- java最简单的输入代码,java编程输入
- 新媒体运营如何选择公司,新媒体运营如何选择公司岗位