You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:03:27