使用asciimatics播放动画后调用input()报错RuntimeError: input(): lost sys.stdin求解
解决asciimatics动画后input()报错RuntimeError: input(): lost sys.stdin的问题
问题根源
asciimatics的Screen.wrapper运行时会接管sys.stdin/sys.stdout用于终端动画渲染,尽管设计上wrapper退出时会自动恢复原输入输出流,但部分场景下可能出现恢复失败,导致后续调用input()时找不到有效标准输入,触发报错。
解决方法1:将输入逻辑整合到Screen上下文内
把后续输入操作放在Screen.wrapper管理的上下文里,避免资源未恢复的问题,修改代码如下:
def demo(screen): scenes = [] scenes.append(PlasmaScene(screen)) screen.play(scenes, stop_on_resize=True, repeat=False) # 动画结束后直接在Screen上下文内处理输入 clear() LOGGED, USER = login_entry(None) def main(): Screen.wrapper(demo) # 调用时直接执行main if __name__ == "__main__": clear() main()
解决方法2:手动恢复标准输入流
如果必须在Screen.wrapper外部使用input(),可在动画结束后手动重新连接标准输入,适配不同操作系统:
import sys import os def animate_intro(): Screen.wrapper(demo) # 动画结束后手动恢复stdin if sys.platform.startswith('win'): sys.stdin = open('CON', 'r') else: sys.stdin = open('/dev/tty', 'r') # 原调用逻辑保持不变 clear() animate_intro() clear() LOGGED, USER = login_entry(None)
内容的提问来源于stack exchange,提问作者etchris
相关产品推荐
相关产品推荐

