Windows系统下Pexpect PopenSpawn无法使用问题求助
解决Windows下PopenSpawn调用SSH报错FileNotFoundError的问题
首先,这个错误的核心原因很明确:你的Windows系统找不到ssh命令。默认情况下,部分Windows版本(尤其是较旧的Win10或更早系统)没有预装OpenSSH客户端,或者ssh.exe所在路径不在系统的环境变量PATH中,导致subprocess找不到这个可执行文件。
下面是一步步的解决方案:
1. 确认并安装OpenSSH客户端
- 方法一:通过Windows设置安装
打开「设置」→「应用」→「可选功能」→「添加功能」,搜索「OpenSSH客户端」,点击安装。 - 方法二:通过PowerShell安装
以管理员身份打开PowerShell,运行命令:Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
安装完成后,打开cmd或PowerShell输入ssh,如果能看到命令提示,说明安装成功。
2. 确保ssh路径在系统PATH中
如果安装后还是报错,可能是ssh.exe的路径没加入环境变量。默认安装路径是C:\Windows\System32\OpenSSH\,你可以:
- 右键「此电脑」→「属性」→「高级系统设置」→「环境变量」,在系统变量的
PATH中添加这个路径。 - 或者在代码里直接指定
ssh.exe的完整路径,修改你的初始化代码:child = pexpect.popen_spawn.PopenSpawn('C:\\Windows\\System32\\OpenSSH\\ssh.exe pi@192.168.178.34')
3. 修复代码中的其他潜在问题
除了路径问题,你的代码还有两个需要调整的地方:
async=True的误用:当expect使用async=True时,返回的是一个asyncio.Future对象,而不是直接的匹配索引0或1。你需要去掉async=True,或者改用异步方式处理,但对于简单的SSH交互,同步方式更适合:a = child.expect(['password:', 'The authenticity of host'], timeout=300)- 密码不一致:代码中两种情况用了不同的密码(
123456789和raspberry),记得改成你树莓派的真实密码,避免登录失败。
修改后的完整测试代码示例:
import traceback import pexpect from pexpect.popen_spawn import PopenSpawn try: # 指定ssh完整路径(如果PATH没配置的话) child = pexpect.popen_spawn.PopenSpawn('C:\\Windows\\System32\\OpenSSH\\ssh.exe pi@192.168.178.34') # 去掉async=True,使用同步匹配 a = child.expect(['password:', 'The authenticity of host'], timeout=300) if a == 0: child.sendline('raspberry') # 统一为树莓派真实密码 print('This IP already exists in known_hosts!') elif a == 1: print('Adding this IP to known_hosts...') child.sendline('yes') child.expect('password:') child.sendline('raspberry') # 发送测试命令 child.sendline("echo TestMessage") child.interact() except pexpect.EOF: traceback.print_exc() except Exception as e: print(f"Unexpected error: {e}") traceback.print_exc()
这样调整后,应该就能正常启动SSH连接并完成交互了。
内容的提问来源于stack exchange,提问作者monamona
相关产品推荐
相关产品推荐

