python-psutil.Process(pid).name的替代
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-psutil.Process(pid).name的替代,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1774字,纯文字阅读大概需要3分钟。
内容图文
我测量了psutil.Process(pid).name的性能,结果发现它比psutil.Process(pid).exe慢十倍以上.由于这些功能的最后一个功能要求对路径具有不同的特权,因此我不能仅从路径中提取文件名.我的问题是:psutil.Process(pid).name是否有其他替代方法?
解决方法:
您提到这是用于Windows的.我看了一下psutil对Windows的作用.看起来psutil.Process().name正在使用Windows工具帮助API.如果查看psutil的Process代码并跟踪.name,它将转到process_info.c中的get_name().它将遍历系统上的所有pid,直至找到所需的pid.我认为这可能是toolhelp API的局限性.但这就是为什么它比.exe慢的原因,后者使用不同的API路径(如您所指出的那样),需要额外的特权.
我想出的解决方案是使用ctypes和ctypes.windll直接调用Windows ntapi.它只需要PROCESS_QUERY_INFORMATION,与PROCESS_ALL_ACCESS不同:
import ctypes
import os.path
# duplicate the UNICODE_STRING structure from the windows API
class UNICODE_STRING(ctypes.Structure):
_fields_ = [
('Length', ctypes.c_short),
('MaximumLength', ctypes.c_short),
('Buffer', ctypes.c_wchar_p)
]
# args
pid = 8000 # put your pid here
# define some constants; from windows API reference
MAX_TOTAL_PATH_CHARS = 32767
PROCESS_QUERY_INFORMATION = 0x0400
PROCESS_IMAGE_FILE_NAME = 27
# open handles
ntdll = ctypes.windll.LoadLibrary('ntdll.dll')
process = ctypes.windll.kernel32.OpenProcess(PROCESS_QUERY_INFORMATION,
False, pid)
# allocate memory
buflen = (((MAX_TOTAL_PATH_CHARS + 1) * ctypes.sizeof(ctypes.c_wchar)) +
ctypes.sizeof(UNICODE_STRING))
buffer = ctypes.c_char_p(' ' * buflen)
# query process image filename and parse for process "name"
ntdll.NtQueryInformationProcess(process, PROCESS_IMAGE_FILE_NAME, buffer,
buflen, None)
pustr = ctypes.cast(buffer, ctypes.POINTER(UNICODE_STRING))
print os.path.split(pustr.contents.Buffer)[-1]
# cleanup
ctypes.windll.kernel32.CloseHandle(process)
ctypes.windll.kernel32.FreeLibrary(ntdll._handle)
内容总结
以上是互联网集市为您收集整理的python-psutil.Process(pid).name的替代全部内容,希望文章能够帮你解决python-psutil.Process(pid).name的替代所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。