在Windows平台上,从原来使用C/c++编写原生EXE程序,到使用Python编写一些常用脚本程序,成熟的模块的使用使得编程效率大大提高了。
不过,python模块虽多,也不可能满足开发者的所有需求,而且,模块为了便于使用,通常都封装过度,有些功能无法灵活使用,必须直接调用Windows API来实现。
要完成这一目标,有两种办法,一种是使用C语言编写Python扩展模块,或者就是编写普通的DLL通过Python的ctypes来调用,但是这样就部分牺牲掉了Python的快速开发,免编译特性。
还好,有一个模块pywin32可以解决这个问题,它直接包装了几乎所有的Windows API,可以方便地从Python直接调用,该模块另一大主要功能是通过Python进行COM编程。
该项目是开源的,项目地址是:https://github.com/mhammond/pywin32
安装时可以直接使用pip执行“pip安装pywin32”来安装它。
安装完毕后,在Python安装路径下的Lib \网站\ win32可以看到所有的API支撑模块,Lib \网站\ win32com下则是COM的支撑模块。
在Lib \网站下有一个PyWin32.CHM帮助文件,相信对Windows编程有一定基础的,看了这个帮助文件就能很快上手。
简单说,pywin32把Windows API按照功能分了一些大类,每一个大类作为一个模块。以下是所有的模块:
mmapfile odbc的perfmon servicemanager计时器win2kras win32api win32clipboard win32console
引用>
win32cred win32crypt win32event win32evtlog win32file win32gui win32help win32inet win32job
win32lz win32net win32pdh win32pipe win32print win32process win32profile win32ras win32security
win32service win32trace win32transaction win32ts win32wnet winxpgui比如文件类API就在模块win32file中,进程类API在模块win32process中。
在使用的时候,按需导入相关模块就行了,win32con则定义了所有的常量,几乎是必不可少的,一些难以分类的API则在模块win32api中(大部分是kernel32.dll导出的API)。
部分模块之间还存在一些交叉,比如它仅仅的参数中用到的GENERIC_READ常量,在win32con中有定义,在win32file中也有定义。
用户只要大概知道这个是文件API用到的常量,那么不管你写win32file.GENERIC_READ还是win32con.GENERIC_READ都是可以的。
关闭句柄用的CloseHandle函数也是在两个模块中都有定义的。
需要注意的是,微软提供的Wsa系列网络API也都在win32file模块中,因为很多操作系统都是把套接字也用为文件对象来操作的。
如果你不清楚要使用的API在哪个模块中,那就到帮助文件里搜索一下,一定会给你答案的。
如果你只是对pywin32中如何调用某个API不熟悉,那么查看Pywin32.CHM就足够了,如果你对API本身的参数定义和使用不熟悉,那还得继续看MSDN。
下面来写一个Helloworld作为开始吧:
进口win32api 进口win32con win32api.MessageBox(没有“你好,pywin32 !”,“pywin32”, win32con.MB_OK)效果如下:
在Lib \网站\ win32 \演示目录下有许多例子,如果你还不清楚pywin32怎么上的手,来看看这些例子就知道了。
比如使用API进行文件操作:
#这是一个“演示”win32file——它曾经是比一个一个测试用例 #演示,所以被移动到测试目录。 #请提供你最喜欢的简单的演示。 进口win32file win32api win32con 进口操作系统 #一个非常简单的演示,请注意,这并没有超过你可以做 #内装式Python文件对象,所以这么简单的东西,你 #一般* *应该使用装入的Python对象。只使用win32file等 #当你需要win32 Python中的特定功能不可用。 def SimpleFileDemo (): testName=os.path。加入(win32api.GetTempPath (),“win32file_demo_test_file”) 如果os.path.exists (testName): os.unlink (testName) #打开文件编写。 处理=win32file.CreateFile (testName, win32file.GENERIC_WRITE, 0, 没有, win32con.CREATE_NEW, 0, 没有一个) test_data=" https://www.yisu.com/zixun/Hello/0there " .encode (ascii) win32file。test_data WriteFile(处理) handle.Close () #打开阅读。 处理=win32file。它仅仅(testName win32file。GENERIC_READ 0, win32con。OPEN_EXISTING, 0,没有) rc、数据=win32file。ReadFile(句柄,1024) handle.Close() #此处也可使用win32file.CloseHandle(处理)来关闭句柄 如果数据==test_data: 打印“成功写入和读取文件” 其他: 提高异常(“有不同的数据回# 63;& # 63;& # 63;”) os.unlink (testName) if __name__==癬_main__”: SimpleFileDemo ()Windows平台Python编程必会模块之pywin32介绍