我使用的笔记本需要用户输入。我可以在Jupyter Notebook中更改代码,但不能更改Jupyter Notebook所依赖的Python库的代码。用户输入请求来自这些库之一。
Jupyter Notebook是否可以自动发送一些预定义的用户输入?也就是说,模拟用户输入吗?
例如,在下面的Jupyter Notebook单元中,我希望Jupyter Notebook在用户提示期间自动输入O
,这样用户就不必自己输入任何输入:
用户输入通过以下代码来自某个库:
inp = input ("Dataset with same name already exists.\nEnter 'O' to Overwrite or 'L' to Load the existing one." )
答案 0 :(得分:2)
我回答时的环境:
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
而不是 _input_request
,后者是 Jupyter 中 input
的第一种方法。
答案 1 :(得分:0)
在不离开Python的温和优雅的情况下,我不知道有什么方法可以处理它。
但是,您应该能够扩展Python并将PyOS_ReadlineFunctionPointer
设置为返回期望值的东西。像here。
但是我肯定会首先尝试检查其他类型的解决方案。例如。 display()
方法有一些实现-也许可以更改其行为。也许方法本身可以更改。也许您根本不需要调用它-也许您可以在自己提供所有必要输入的同时进行操作。