我需要帮助才能弄清楚这件事 昨天我在我的Win7 64位笔记本电脑上安装了Spyder 2.3测试版与Anaconda Python 3.3一起使用。 打开一个内部控制台窗口,我注意到每秒触发的错误,
Traceback (most recent call last):
File "C:\Miniconda3\lib\site-packages\spyderlib\widgets\status.py", line 80, in update_label
self.label.setText('%d %%' % self.get_value())
File "C:\Miniconda3\lib\site-packages\spyderlib\widgets\status.py", line 93, in get_value
return memory_usage()
File "C:\Miniconda3\lib\site-packages\spyderlib\utils\system.py", line 20, in windows_memory_usage
class MemoryStatus(wintypes.Structure):
AttributeError: 'module' object has no attribute 'Structure'
这似乎来自system.py在未安装wintype.Structure
时尝试使用“psutil
”的事实,我看不到像Structure类(或模块)这样的东西)wintypes.py ... {偶数c_uint64
不在wintypes
。
我以简单的方式解决了这个问题 - 我刚刚安装了psutil
并完成了。但事实是,有几个脚本似乎使用wintypes.Structure
(请参阅Google)。我真的不明白......所以我错过了什么?
谢谢!
答案 0 :(得分:0)
我正在编辑我的答案。
这里的问题似乎是wintypes.py的Python 2.7版本(来自ctypes 1.1.0软件包)以
开头
from ctypes import *
而来自Python 3.3 ctypes 1.1.0软件包的wintypes.py使用:
import ctypes
所以基本上wintypes.Structure
,.c_uint64
,.sizeof
和.byref
都来自ctypes
。它们不会在wintypes
中被改变 - 至少不会达到1.1.0版本。因此,对Spyder(2.3.0beta3)的status.py
进行的更改应该可以使Python 2.7和Python 3.3都没有错误:
def windows_memory_usage():
"""Return physical memory usage (float)
Works on Windows platforms only"""
from ctypes import windll, Structure, c_uint64, sizeof, byref
from ctypes.wintypes import DWORD
class MemoryStatus(Structure):
_fields_ = [('dwLength', DWORD),
('dwMemoryLoad',DWORD),
('ullTotalPhys', c_uint64),
('ullAvailPhys', c_uint64),
('ullTotalPageFile', c_uint64),
('ullAvailPageFile', c_uint64),
('ullTotalVirtual', c_uint64),
('ullAvailVirtual', c_uint64),
('ullAvailExtendedVirtual', c_uint64),]
memorystatus = MemoryStatus()
# MSDN documetation states that dwLength must be set to MemoryStatus
# size before calling GlobalMemoryStatusEx
# http://msdn.microsoft.com/en-us/library/aa366770(v=vs.85)
memorystatus.dwLength = sizeof(memorystatus)
windll.kernel32.GlobalMemoryStatusEx(byref(memorystatus))
return float(memorystatus.dwMemoryLoad)