Anaconda 3.5.5中导入mayavi后input方法回车无输入时挂起求助
input()直接回车挂起的问题 问题背景
我最近从自定义Python 3.6环境切换到Anaconda Python 3.5.5后碰到了一个棘手的小问题:代码里用input('Please press enter!')让用户按回车继续时,直接回车(不输入任何字符)程序就会挂起,但输入任意字符再回车就完全正常。
更奇怪的是,这个问题只在导入mayavi.mlab时出现,移除该导入后就消失了——可我必须保留Mayavi的使用。我的运行环境是Windows系统下的Visual Studio Code,代码位置不影响问题复现,核心结构和导入模块如下:
核心代码片段
# 导入的模块清单 import tkinter import xlwings import numpy import traceback from mayavi import mlab import sys import time from win32api import GetSystemMetrics from win32com.client import gencache def main_wrapper(): # 包装主程序以捕获异常并展示给用户 try: main() except Exception as ex: print('Unexpected exception occurred...') traceback.print_exc() if __name__ == '__main__': main_wrapper() junk = input('Please press enter!') # 就是这行代码出问题
可行解决方案
经过排查,这个问题大概率是Mayavi导入后修改了标准输入流的行为逻辑导致的。这里有几个针对性的解决办法:
1. 用sys.stdin.readline()替代input()
input()本质是对sys.stdin.readline()的封装,但Mayavi可能干扰了input()的内部处理逻辑。直接使用底层的readline()可以绕过这个问题:
import sys print('Please press enter!') sys.stdin.readline()
这个方法无需额外依赖,直接替换原有input()语句即可,直接回车也能正常响应,是最简洁的解决方案。
2. 重置标准输入流
如果坚持要保留input()的语法,可以在导入Mayavi后强制重置标准输入流,让它指向Windows控制台设备:
from mayavi import mlab import sys # 重置标准输入为控制台设备 sys.stdin = open('CON', 'r') # 之后再使用input()就正常了 junk = input('Please press enter!')
Windows系统中'CON'是控制台的设备名,打开它可以强制让输入流回到控制台,避开Mayavi的干扰。
3. 用tkinter消息框替代控制台输入
既然你的代码已经导入了tkinter,完全可以用图形化消息框替代控制台输入,彻底避开输入流的问题:
import tkinter as tk from tkinter import messagebox # 隐藏tkinter主窗口(如果不需要的话) root = tk.Tk() root.withdraw() # 弹出消息框,用户点击确定后程序继续 messagebox.showinfo('提示', '请点击确定继续...')
这个方案适合有GUI需求的场景,体验比控制台输入更友好,也完全不受Mayavi的影响。
4. 调整Mayavi后端设置(非可视化场景适用)
Mayavi默认的GUI后端(比如Qt、wx)可能会抢占控制台输入资源。如果你的场景不需要Mayavi的可视化界面,可以强制指定非GUI后端:
from mayavi import mlab mlab.options.backend = 'none' # 禁用GUI后端,仅保留计算功能
注意:这个方法只适合不需要显示3D图形的场景,如果需要可视化功能就不适用了。
总结
最推荐第一种方案,用sys.stdin.readline()替代input(),简单直接且不影响现有功能;如果要保留input()语法,第二种重置输入流的方法也能解决问题;如果程序本身带GUI,第三种tkinter消息框的方案体验最优。
内容的提问来源于stack exchange,提问作者user2731076

