如何在pexpect.spawn中用poll()替代select()解决文件描述符超限问题
在pexpect.spawn()中使用poll()替代select()的方法
完全理解你的痛点——select()的1024文件描述符限制确实很烦人,好在pexpect已经内置了切换到poll()的支持,不用自己折腾底层逻辑,下面是具体的实现方式:
1. 单个spawn实例启用poll()
在创建pexpect.spawn()对象时,直接传入use_poll=True参数即可,这是最直接的方式:
import pexpect # 初始化spawn时明确指定使用poll child_process = pexpect.spawn("your_target_command", use_poll=True) # 后续正常使用spawn的方法,比如expect、sendline等 child_process.expect("some_prompt") child_process.sendline("your_input")
2. 全局默认启用poll()
如果你的项目里有很多spawn实例,不想每个都加参数,可以修改pexpect的全局默认配置:
import pexpect # 设置所有新创建的spawn对象默认使用poll pexpect.spawn.default_use_poll = True # 之后创建的spawn实例都会自动用poll,无需再传参数 child1 = pexpect.spawn("command1") child2 = pexpect.spawn("command2")
3. 验证是否切换成功
可以通过查看spawn对象的waiter属性类型,确认是否使用了PollWaiter:
print(type(child_process.waiter)) # 正确输出应该是:<class 'pexpect.poll.PollWaiter'>
原理说明
pexpect内部通过waiter机制处理IO等待:当use_poll=True时,它会实例化pexpect.poll.PollWaiter(基于select.poll()实现),而非默认的SelectWaiter(基于select.select())。这样就能突破select()的文件描述符数量限制,完美解决你遇到的问题。
如果你的pexpect版本比较老(比如低于4.0),建议先升级到最新稳定版,确保use_poll参数可用。
内容的提问来源于stack exchange,提问作者Suresh Kota
相关产品推荐
相关产品推荐

