如何在Jupyter Notebook中修改sys.stdin以用input()读取文件内容?
解决Jupyter Notebook中重定向sys.stdin后input()仍弹出输入框的问题
你遇到的这个问题其实是Jupyter Notebook(以及IPython环境)的特性导致的——这里的input()函数并不是直接依赖sys.stdin实现的,它是环境专门封装的交互输入工具,所以直接替换sys.stdin并不会让它读取文件内容,还是会弹出输入框。
给你几个可行的解决方案:
方案1:直接读取文件内容(简单直接)
如果只是需要读取文件里的内容,完全可以绕过input(),直接操作文件对象:
# 推荐用with语句自动管理文件关闭 with open("input.in", "r", encoding="utf-8") as file: # 读取第一行(对应一次input()的效果) val = file.readline().strip() # 如果需要读取全部内容,用file.read() # all_content = file.read() print(val)
方案2:自定义input()函数模拟文件读取
如果你的代码里有大量input()调用,不想逐个修改,可以自己实现一个替代input()的函数,让它从预读的文件内容里逐行取数据:
# 先把文件所有行读入列表,去掉换行符 with open("input.in", "r", encoding="utf-8") as f: input_buffer = [line.rstrip('\n') for line in f] current_line = 0 def file_input(): global current_line if current_line >= len(input_buffer): raise EOFError("没有更多输入内容了") line = input_buffer[current_line] current_line += 1 return line # 替换全局的input函数 input = file_input # 现在调用input()就会读取文件里的内容了 val1 = input() print(val1) val2 = input() print(val2)
方案3:用%run命令执行脚本
如果你的代码原本是作为独立脚本写的,不想修改代码,可以把代码保存成.py文件(比如test.py),然后在Notebook里用IPython的魔术命令%run来执行:
%run test.py
这种方式会在接近常规Python脚本的环境里运行代码,你的sys.stdin替换逻辑就能正常生效,不会弹出输入框。
内容的提问来源于stack exchange,提问作者Seljuk Gulcan




