python win32api手册可以直接调用win32的api吗

Python调用系统API获取Windows监控状态。 - 推酷
Python调用系统API获取Windows监控状态。
的补充,替换了原有的WMI模块。
在实际使用中,发现WMI组件比较慢,所以我先尝试直接使用系统API实现。
WIN32编程本身没有什么难度,熟悉系统API就行,我写了段C++的试验代码公开在此
后来我就去查如何利用这些代码给Python提供信息,不使用第三方组件的话,最合适的方法就是使用ctype。后来一想,既然能调用DLL,那为什么不python直接调用系统的DLL呢。。。
后来就去试了一下,果然可行。
,是从同事的项目
里直接fork,然后改写的。
CTYPE 和 运行时动态链接技术
CTYPE是整个过程的桥梁,它为Python提供了Windows的运行时动态链接技术的接口。
动态链接技术不用多讲,Windows的实现就是DLL。DLL的连接通常在编译时就利用LIB文件确定了,但是Windows API还提供运行时动态链接技术,允许程序在运行时动态指定DLL,访问其方法。CTYPE里就允许使用运行时动态链接技术载入Windows的DLL。
from ctypes import *
from ctypes.wintypes import *
ctypes.wintypes本身提供了一些常见Windows数据类型宏的定义,我在使用中还补充了个别需要的数据类型。
SIZE_T = c_ulong
PWCHAR = c_wchar_p
PCHAR = c_char_p
UCHAR = c_byte
获取CPU信息
以CPU为例,我简述一下实现过程。
首先,我们需要调用系统ntdll的NtQuerySystemInformation方法。其说明可以在这里查到
,里面有大量Windows宏,所以第一次接触的话可能会觉得看上去怪怪的,我不想赘述,因为需要蛮多WIN32基础。
调用它超级方便
ntdll = WinDLL('ntdll.dll')
其中,WinDLL是ctype提供的一个包装好的函数(还是类,忘了),可以使用当前运行时载入dll,并以类的方法返回。然后就可以这样调用了:
ntdll.NtQuerySystemInformation(........)
这个函数有两种用法(事实上大多数WIN32函数都有类似的用法,有空我再夸夸WIN32的API设计,除了恶心的命名法,这么多年基本不用变,当时的设计真心漂亮):
第一个参数指明我要查询什么信息,第二个参数给段分配好的内存,然后利用结构体和指针返回信息,第三个参数指明第三个参数的大小,第四个参数是个指针,函数会返回写入数据的实际大小。
第一个参数指明我要查询什么信息,第二个参数为NULL,第三个参数是0,第四个参数返回。
可以看出我们需要两个额外的Python没有的东西:结构体和指针。
需要的结构体原始定义是这样,典型的微软风格,一次性把类型和指针一起定义了,还包含了几个保留参数:
typedef struct _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION {
LARGE_INTEGER IdleT
LARGE_INTEGER KernelT
LARGE_INTEGER UserT
LARGE_INTEGER Reserved1[2];
ULONG Reserved2;
} SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION, *PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;
由于没有用到,指针和原始结构体都可以舍弃,所以我只定义了SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION。
class SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION(Structure):
_fields_ = [
('IdleTime', LARGE_INTEGER),
('KernelTime', LARGE_INTEGER),
('UserTime', LARGE_INTEGER),
('Reserved1', LARGE_INTEGER * 2),
('Reserved2', ULONG),
看得出来很简单,一一对应的,注意数组的处理。
size = ULONG()
ntdll.NtQuerySystemInformation(8, 0, 0, byref(size))
8 是枚举类型 SYSTEM_INFORMATION_CLASS::SystemProcessorPerformanceInformation的实际数字,为了简化我就没有单独定义,byref则能取出一个指针来。
这样的话,size 就包含了实际需要存下的结构数组空间的长度。
count = size.value/sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)
#便是需要的结构体的个数(也就是CPU的内核数)。
sppis = (SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION * count)()
#这样就弄出了一个结构数组
当然我们这里假定了size.value必然是sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)的整数倍,这样做是不安全的:
最佳的方案是使用其他API取出CPU的内核数,而这里使用WIN32的堆来分配内存。
lpvoid = windll.kernel32.HeapAlloc(windll.kernel32.GetProcessHeap(), 0, size.value)
然后再使用cast方法吧 void * 转化为数组指针
cast(lpvoid, POINTER(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION))[0]
ntdll.NtQuerySystemInformation(8, byref(sppis), sizeof(sppis), byref(size))
for i in range(0, count):
print sppis[i].IdleTime
#遍历信息,做出应该的处理。
其他模块基本原理一致,不过取出来的基本都是系统开机以来的统计值,需要自己计算速率的问题。源码里有相关非拥塞实现。
需要说明的是,Windows API提供的这些内存、CPU、Drive数据都是抽象过后的概念,如果需要获取硬件级别的数据,需要使用设备管理相关的API。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致ImportError: No module named win32api | Python | Python
this category
ImportError: No module named win32api
Oct&9,&&PM
Post #1 of 4
(5157 views)
ImportError: No module named win32api
Hi, I was trying to run a python script from my DOS prompt. I got the following error message: E:\&installer.py Traceback (most recent call last):
File "E:\installer.py", line 101, in ?
import win32api, win32file ImportError: No module named win32api
Can anyone tell me what this error message means? My OS is Windows XP. is win32api something that's only available on windows2000, but not on XP?
Thank you in advance! eddy
Oct&9,&&PM
Post #2 of 4
(5110 views)
ImportError: No module named win32api
eddie wang wrote:
& Hi, I was trying to run a python script from my DOS prompt. I got the & following error message: & E:\&installer.py & Traceback (most recent call last): &
File "E:\installer.py", line 101, in ? &
import win32api, win32file & ImportError: No module named win32api &
That means you probably don't have Mark Hammond's Win32 extensions. It
appears the script your are trying to run is looking for the Windows API
You can download the win32 extensions from the following URL and it should
give you the win32* modules:
starship.python.net/crew/mhammond/win32/Downloads.html
Mark Nenadov, Freelance Software Developer web:
e-mail: mark [at] freelance-developer
Oct&10,&&AM
Post #3 of 4
(5110 views)
ImportError: No module named win32api
eddie wang wrote:
& Hi, I was trying to run a python script from my DOS prompt. I got the & following error message: & E:\&installer.py & Traceback (most recent call last): &
File "E:\installer.py", line 101, in ? &
import win32api, win32file & ImportError: No module named win32api &
& Can anyone tell me what this error message means? My OS is Windows XP. & is win32api something that's only available on windows2000, but not on & XP?
win32api should work fine on XP just as it does in Win2K, but it's not part of the stsndard Python distribution.
You can download it from the page of its author, Mark Hammond:
Be sure to download the right version -- e.g. latest stable one for Python 2.2 is:
Each win32all version is a self-unpacking, self-installing executable.
Oct&10,&&PM
Post #4 of 4
(5106 views)
ImportError: No module named win32api
Alex and Mark, Thank you so much for the information! it worked.
&&&&Announce
&&&&Python
&&&&Checkins
Interested in having your list archived?
Powered by Gossamer Threads Inc.只需一步,快速开始
后使用快捷导航没有帐号?
查看: 585|回复: 1
Python3.4安装Pywin32,导入win32api报错
签到天数: 155 天[LV.7]常住居民III
马上注册加入鱼C,享用更多服务吧^_^
才可以下载或查看,没有帐号?
使用win32api对注册表进行操作:
1. 安装pywin32-win32-218版本(本身电脑系统为Win7 32bit)
2. 导入时发生错误,搜索site-package文件夹中,没有win32api.py
3. 安装过程中没有任何报错!
请大神们帮忙看看,如何解决?万分感谢
_205152.png (6.89 KB, 下载次数: 0)
20:53 上传
如果您的【问题求助】得到满意的解答,请自行将分类修改为【已经解决】;如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】鼓励;善用【论坛搜索】功能,那里可能有您想要的答案!
签到天数: 155 天[LV.7]常住居民III
百度知道解决方法,网址如下:
/article/72ee561aa7f129e16138dfa1.html
如果您的【问题求助】得到满意的解答,请自行将分类修改为【已经解决】;如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】鼓励;善用【论坛搜索】功能,那里可能有您想要的答案!
•••(
Powered bypython win32api操作句柄
[问题点数:20分]
python win32api操作句柄
[问题点数:20分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2006年5月 PHP大版内专家分月排行榜第二2006年4月 PHP大版内专家分月排行榜第二2007年1月 PHP大版内专家分月排行榜第二
2013年10月 其他开发语言大版内专家分月排行榜第三2007年2月 PHP大版内专家分月排行榜第三
2006年5月 PHP大版内专家分月排行榜第二2006年4月 PHP大版内专家分月排行榜第二2007年1月 PHP大版内专家分月排行榜第二
2013年10月 其他开发语言大版内专家分月排行榜第三2007年2月 PHP大版内专家分月排行榜第三
2014年8月 其他开发语言大版内专家分月排行榜第二2014年7月 其他开发语言大版内专家分月排行榜第二2014年5月 其他开发语言大版内专家分月排行榜第二2014年4月 其他开发语言大版内专家分月排行榜第二2014年3月 其他开发语言大版内专家分月排行榜第二2014年1月 其他开发语言大版内专家分月排行榜第二2013年12月 其他开发语言大版内专家分月排行榜第二2013年11月 其他开发语言大版内专家分月排行榜第二2013年3月 其他开发语言大版内专家分月排行榜第二2012年5月 其他开发语言大版内专家分月排行榜第二2012年4月 其他开发语言大版内专家分月排行榜第二2010年10月 其他开发语言大版内专家分月排行榜第二2010年9月 其他开发语言大版内专家分月排行榜第二
2013年9月 其他开发语言大版内专家分月排行榜第三2012年6月 其他开发语言大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 python win32api 下载 的文章

 

随机推荐