首页 > 解决方案 > 如何在 Jupyter Notebook 中模拟用户输入?

问题描述

我使用的笔记本要求一些用户输入。我可以更改 Jupyter Notebook 中的代码,但无法更改 Jupyter Notebook 所依赖的 Python 库的代码。用户输入请求来自这些库之一。

是否可以让 Jupyter Notebook 自动发送一些预定义的用户输入?也就是说,模拟用户输入?

例如,在下面的 Jupyter Notebook 单元格中,我希望 Jupyter NotebookO在用户提示期间自动输入,这样用户就不必自己输入任何输入:

在此处输入图像描述

用户输入通过以下代码来自某个库:

inp = input ("Dataset with same name already exists.\nEnter 'O' to Overwrite or 'L' to Load the existing one." )

标签: pythonjupyter-notebookuser-input

解决方案


我在回答时的环境:

jupyter core     : 4.6.3
jupyter-notebook : 6.1.4
ipython          : 7.19.0
ipykernel        : 5.3.4
jupyter client   : 6.1.7

您可以使用上下文管理器临时替换input为要重新输入的消息。此代码应在一个单元格的范围内工作:

from contextlib import contextmanager
import builtins

@contextmanager
def repeat(answer: str):
    try:
        original_input = builtins.input
        
        def mock_input(*args, **kwargs):
            return answer
        
        builtins.input = mock_input
        yield
    
    finally:
        builtins.input = original_input

        
#TEST
with repeat('O'):
    answer_1 = input('Continue?')
    answer_2 = input('Continue?')
    answer_3 = input('Continue?')
    
print(answer_1)
print(answer_2)
print(answer_3)

如果它不起作用或者您想更换input多个单元格(假设您同时运行多个或所有单元格),您可以尝试以下操作:

from ipykernel.ipkernel import IPythonKernel

ipython_input = IPythonKernel._input_request

def my_input(*args, **kwargs):
    print('Hello world!')
    return ipython_input(*args, **kwargs)

IPythonKernel._input_request = my_input

只需将身体替换为my_input您需要的即可。

作为替代方法,请尝试替换IPythonKernel.raw_input,而不是使用 Jupyter_input_request中的第一种方法。input


推荐阅读