Python向PuTTY发送@符号失败及输入问题求助
解决PuTTY中通过Python SendKeys无法输入@符号的问题
我之前也碰到过类似的SendKeys特殊字符在PuTTY里失效的情况,结合你的xterm终端场景,给你几个可行的解决方案:
方案1:使用ASCII码直接发送
SendKeys支持通过{ASC nnn}格式发送指定ASCII码的字符,@的ASCII码是64,直接把字符串中的@替换成这个指令就能绕过按键映射问题:
def sendToPutty(): handle = win32gui.FindWindow(None, usrPuttyTitle) shell = win32com.client.Dispatch("WScript.Shell") shell.SendKeys('%') win32gui.SetForegroundWindow(handle) # 将字符串中的@替换为ASCII码指令 processed_ptyFoo = ptyFoo.replace('@', '{ASC 064}') shell.SendKeys(ptyLockCMD + processed_ptyFoo + '{ENTER}')
这个方法直接向终端发送字符的ASCII编码,xterm终端能准确识别,不用纠结按键组合的问题。
方案2:模拟Alt+数字小键盘的按键组合
如果方案1没效果,可以试试模拟标准的Alt+数字小键盘输入@的操作(Alt+64,注意是数字小键盘的6和4)。SendKeys里用%代表Alt,{NUMPAD6}和{NUMPAD4}对应数字小键盘按键:
def sendToPutty(): handle = win32gui.FindWindow(None, usrPuttyTitle) shell = win32com.client.Dispatch("WScript.Shell") shell.SendKeys('%') win32gui.SetForegroundWindow(handle) # 拆分字符串,遇到@时发送按键组合 parts = ptyFoo.split('@') for idx, part in enumerate(parts): shell.SendKeys(part) if idx != len(parts)-1: # 发送Alt+小键盘6+小键盘4 shell.SendKeys('%{NUMPAD6}%{NUMPAD4}') shell.SendKeys(ptyLockCMD + '{ENTER}')
注意:这个方法需要确保数字小键盘处于开启状态,不确定的话可以先发送{NUMLOCK}切换到开启模式。
方案3:剪贴板粘贴法(最可靠备选)
如果前两种方法都失效,还有个万能思路:把@复制到剪贴板,再发送^v(Ctrl+V)粘贴,完全绕开按键映射问题:
import win32clipboard def sendToPutty(): handle = win32gui.FindWindow(None, usrPuttyTitle) shell = win32com.client.Dispatch("WScript.Shell") shell.SendKeys('%') win32gui.SetForegroundWindow(handle) # 处理字符串,遇到@就执行粘贴操作 processed_content = [] for char in ptyFoo: if char == '@': # 将@写入剪贴板 win32clipboard.OpenClipboard() win32clipboard.EmptyClipboard() win32clipboard.SetClipboardText('@') win32clipboard.CloseClipboard() processed_content.append('^v') else: processed_content.append(char) shell.SendKeys(ptyLockCMD + ''.join(processed_content) + '{ENTER}')
只要PuTTY默认的粘贴功能正常,这个方法基本不会出错。
额外注意事项
- 确认
ptyFoo里的@是半角ASCII字符,不是全角的中文@,否则即使发送成功也会显示异常; - 发送前可以加个
time.sleep(0.1),确保SetForegroundWindow已经把PuTTY窗口激活到前台,避免按键发送到其他窗口。
内容的提问来源于stack exchange,提问作者stsm
相关产品推荐
相关产品推荐

