Windows平台Python编程必会模块之pywin32介绍
在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 install pywin32”来安装它。 安装完毕后,在Python安装路径下的Libsite-packageswin32可以看到所有的API支撑模块,Libsite-packageswin32com下则是COM的支撑模块。 在Libsite-packages下有一个PyWin32.CHM帮助文件,相信对Windows编程有一定基础的,看了这个帮助文件就能很快上手。 简单说,pywin32把Windows API按照功能分了一些大类,每一个大类作为一个模块。以下是所有的模块:
比如文件类API就在模块win32file中,进程类API在模块win32process中。 在使用的时候,按需导入相关模块就行了,win32con则定义了所有的常量,几乎是必不可少的,一些难以分类的API则在模块win32api中(大部分是kernel32.dll导出的API)。 部分模块之间还存在一些交叉,比如CreateFile的参数中用到的GENERIC_READ常量,在win32con中有定义,在win32file中也有定义。 用户只要大概知道这个是文件API用到的常量,那么不管你写win32file.GENERIC_READ还是win32con.GENERIC_READ都是可以的。 关闭句柄用的CloseHandle函数也是在两个模块中都有定义的。 需要注意的是,微软提供的Wsa系列网络API也都在win32file模块中,因为很多操作系统都是把套接字也用为文件对象来操作的。 如果你不清楚要使用的API在哪个模块中,那就到帮助文件里搜索一下,一定会给你答案的。 如果你只是对pywin32中如何调用某个API不熟悉,那么查看Pywin32.CHM就足够了,如果你对API本身的参数定义和使用不熟悉,那还得继续看MSDN。 下面来写一个Helloworld作为开始吧: import win32api import win32con win32api.MessageBox(None,"Hello,pywin32!","pywin32",win32con.MB_OK) 效果如下: 在Libsite-packageswin32Demos目录下有许多例子,如果你还不清楚pywin32怎么上手,来看看这些例子就知道了。 比如使用API进行文件操作: # This is a "demo" of win32file - it used to be more a test case than a # demo,so has been moved to the test directory. # Please contribute your favourite simple little demo. import win32file,win32api,win32con import os # A very simple demo - note that this does no more than you can do with # builtin Python file objects,so for something as simple as this,you # generally *should* use builtin Python objects. Only use win32file etc # when you need win32 specific features not available in Python. def SimpleFileDemo(): testName = os.path.join( win32api.GetTempPath(),"win32file_demo_test_file") if os.path.exists(testName): os.unlink(testName) # Open the file for writing. handle = win32file.CreateFile(testName,win32file.GENERIC_WRITE,None,win32con.CREATE_NEW,None) test_data = "Hello there".encode("ascii") win32file.WriteFile(handle,test_data) handle.Close() # Open it for reading. handle = win32file.CreateFile(testName,win32file.GENERIC_READ,win32con.OPEN_EXISTING,None) rc,data = win32file.ReadFile(handle,1024) handle.Close() #此处也可使用win32file.CloseHandle(handle)来关闭句柄 if data == test_data: print "Successfully wrote and read a file" else: raise Exception("Got different data back???") os.unlink(testName) if __name__=='__main__': SimpleFileDemo() 可以看一看上面的例子是如何使用Windows API的,相信对于pywin32模块的使用会有一个初步的认识。 有了pywin32模块的辅助,对于Windows下的Python编程绝对是如虎添翼。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |