AttributeError:'module'对象在python中没有属性'windll'
Posted
技术标签:
【中文标题】AttributeError:\'module\'对象在python中没有属性\'windll\'【英文标题】:AttributeError: 'module' object has no attribute 'windll' in pythonAttributeError:'module'对象在python中没有属性'windll' 【发布时间】:2016-01-18 22:09:58 【问题描述】:我正在尝试自动化 Web 应用程序。我应该单击一个链接,它会打开一个打印窗口。我无法在 selenium 自动化中实现这一点。所以我使用 ctypes 来像选项卡一样进行按键操作,输入关键事件。下面是我为实现这一目标而开发的库。我通过调用相应的方法来完成这些事件。
import ctypes
import time
SendInput = ctypes.windll.user32.SendInput
# C struct redefinitions
PUL = ctypes.POINTER(ctypes.c_ulong)
class KeyBdInput(ctypes.Structure):
_fields_ = [("wVk", ctypes.c_ushort),
("wScan", ctypes.c_ushort),
("dwFlags", ctypes.c_ulong),
("time", ctypes.c_ulong),
("dwExtraInfo", PUL)]
class HardwareInput(ctypes.Structure):
_fields_ = [("uMsg", ctypes.c_ulong),
("wParamL", ctypes.c_short),
("wParamH", ctypes.c_ushort)]
class MouseInput(ctypes.Structure):
_fields_ = [("dx", ctypes.c_long),
("dy", ctypes.c_long),
("mouseData", ctypes.c_ulong),
("dwFlags", ctypes.c_ulong),
("time",ctypes.c_ulong),
("dwExtraInfo", PUL)]
class Input_I(ctypes.Union):
_fields_ = [("ki", KeyBdInput),
("mi", MouseInput),
("hi", HardwareInput)]
class Input(ctypes.Structure):
_fields_ = [("type", ctypes.c_ulong),
("ii", Input_I)]
# Actuals Functions
class KeyEvents :
def PressKey(self,hexKeyCode):
extra = ctypes.c_ulong(0)
ii_ = Input_I()
ii_.ki = KeyBdInput( hexKeyCode, 0x48, 0, 0, ctypes.pointer(extra) )
x = Input( ctypes.c_ulong(1), ii_ )
SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
def ReleaseKey(self,hexKeyCode):
extra = ctypes.c_ulong(0)
ii_ = Input_I()
ii_.ki = KeyBdInput( hexKeyCode, 0x48, 0x0002,0,ctypes.pointer(extra) )
x = Input( ctypes.c_ulong(1), ii_ )
SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
def PressAltTab(self):
'''
Press Alt+Tab and hold Alt key for 2 seconds in order to see the overlay
'''
self.PressKey(0x012) #Alt
self.PressKey(0x09) #Tab
self.ReleaseKey(0x09) #~Tab
time.sleep(2)
self.ReleaseKey(0x012)
def PressTab(self):
'''
Press Tab Key
'''
#self.AltTab()
self.PressKey(0x09) #Tab
self.ReleaseKey(0x09)
def PressEnter(self):
'''
PressEnter
'''
#self.AltTab()
self.PressKey(0x0D)#Enter Key
self.ReleaseKey(0x0D)
但是现在当我在 linux 中使用代码时,我得到了以下错误
File "KeyEvents.py", line 4, in <module>
SendInput = ctypes.windll.user32.SendInput
AttributeError: 'module' object has no attribute 'windll'
我不明白这里出了什么问题。我对 python 很陌生。请在这里帮助我。我应该怎么做才能在 linux 中实现按键事件?
【问题讨论】:
【参考方案1】:这段代码在 Raspian Jessie (Raspberry Pi) 上运行时也遇到了同样的问题。我认为这是因为 windll.user32.SendInput 仅适用于 Windows。好像没有跨平台的灵活性..
如果你需要在 Linux 上做 Keypress 事件,你可以试试 xdotools。 我认为这非常简单,应该可以满足您的所有需求。
要安装,只需执行
sudo apt-get install xdotool
和
xdotool 键 alt+Tab
用于 alt+Tab 按键。
更详细的可以参考 http://xmodulo.com/simulate-key-press-mouse-movement-linux.html
【讨论】:
以上是关于AttributeError:'module'对象在python中没有属性'windll'的主要内容,如果未能解决你的问题,请参考以下文章
api = twitter.Api() AttributeError: 'module' 对象没有属性 'Api
AttributeError:'module'对象在python中没有属性'windll'
如何修复python2.7中的“AttributeError:'module'对象没有属性'storage'”错误