我遇到了一个主要问题:我无法访问用户不拥有的(大多数)流程信息。 例如,以下内容:
for proc in psutil.process_iter():
try:
print proc.pid, proc.username
except psutil.AccessDenied:
print "denied"
打印:
0 NT AUTHORITY\SYSTEM
4 NT AUTHORITY\SYSTEM
428 denied
444 denied
632 my_user
648 denied
676 my_user
704 denied
748 denied
772 denied
804 denied
824 denied
832 denied
880 my_user
920 denied
988 denied
1052 denied
...
对于这些"否认"像get_cpu_times()这样的处理方法可以正常工作。
UPD:抱歉,我使用不同的属性和不同的打印件运行了很多次,我粘贴的输出来自不同的代码(打印username
,而不是{ {1}})。但是,我希望,重点仍然是明确的......
答案 0 :(得分:2)
看起来错误是在底层C代码中生成的。 我不知道whay GetProcessImageFileName()比QueryFullProcessImageName()更受欢迎(因为后者返回路径,就像我们期望的那样,使用驱动器号/ UNC路径),但可能是因为呼叫失败了任何一个。
你可能不得不用the developers来解决这个问题。
来自 _psutil_mswindows.c (第502行):
if (GetProcessImageFileName(hProcess, &exe, nSize) == 0) {
CloseHandle(hProcess);
if (GetLastError() == ERROR_INVALID_PARAMETER) {
// see https://code.google.com/p/psutil/issues/detail?id=414
AccessDenied();
}
else {
PyErr_SetFromWindowsErr(0);
}
return NULL;
}
修改强>
我试图对这些症状进行更多的调查,我还要多报告一下。在具有相对较新的Python 2(2.7.6)的或多或少完全修补的Win7 SP1 x64机器上,我无法访问psutil.Process
类的这些成员:exe
,{{1 },get_ionice()
,get_memory_maps()
,get_nice()
/ get_cwd()
,getcwd()
,get_open_files()
,name
和{{1} }。
这个信息当然可供Windows机器的任何管理员用户使用,因此我不知道为什么psutil无法获取它,除非它是在The Wrong Way™(由Microsoft定义的永久移动目标)中进行的。 / p>