【问题标题】:Jupyter Notebook - Unable to get user input the second time - EOFError: EOF when reading a lineJupyter Notebook - 第二次无法获取用户输入 - EOFError:读取一行时出现EOF
【发布时间】:2021-01-27 14:31:42
【问题描述】:

我正在尝试创建一个类似 UI 的聊天机器人,我希望在其中递归地要求用户通过 input() 函数输入问题并将其传递给外部函数并获取相关答案。

---> 36   ques[0] = input("How can i help you? ")
     37   chat(ques[0])
     38 
EOFError: EOF when reading a line

下面的代码第一次工作 - 获取输入,甚至返回相关的输出。但是,当我点击“再试一次”按钮时(第二次)出现上述错误。

from ipywidgets import interact, widgets
from IPython.display import display, clear_output

ques = [""] 
def chat(q):
  a = faq(q) #FAQ is a function that returns answers to questions
  question = widgets.Text(
      value= ques[0],
      disabled=True
  )
  display(question)

  answer = widgets.Textarea(
      value= a[0][0],
      disabled=True
  )
  display(answer)

  def callback(wdgt):
      display(wdgt.value)

  question.on_submit(callback)

def btn_eventhandler(obj):
  ques[0] = input("How can i help you? ")
  chat(ques[0])    

ques[0] = input("How can i help you? ")
chat(ques[0])

btn = widgets.Button(description='Try again ?')
display(btn)
btn.on_click(btn_eventhandler)

我还希望使用clear_output() 函数,以便为下一次用户输入获得清晰的屏幕。

我真的迷路了。请帮帮我!!

【问题讨论】:

  • 对我来说input() 适合在terminal/console/cmd.exe 工作,但不适用于Jupyter。也许您应该为此使用widget - 即。 widgets.Text()

标签: python jupyter-notebook chatbot eoferror jupyter-widget


【解决方案1】:

input() 是为terminal/console/cmd.exe 创建的,也许这就是为什么它在jupyter 中无法正常工作的原因。

我宁愿使用widgets.Text 来创建input_widget


最少的工作代码

from ipywidgets import interact, widgets
from IPython.display import display, clear_output

#ques = [""] 

def faq(q):
    return [["I don't know !!!"]]

def chat(q):
    a = faq(q) #FAQ is a function that returns answers to questions
    
    question = widgets.Text(
        value = q,
        disabled=True
    )
    display(question)

    answer = widgets.Textarea(
        value= a[0][0],
        disabled=True
    )
    display(answer)

def input_widget(text, callback):
    label = widgets.Label(text)
    
    text = widgets.Text()
    text.on_submit(callback)

    box = widgets.HBox([label, text])
    display(box)

def result(event):
    chat(event.value)    
    
    btn = widgets.Button(description='Try again ?')
    btn.on_click(ask)
    display(btn)

def ask(event=None):
    input_widget("How can i help you? ", result)
    
ask()   


编辑:

在新问题之前使用clear_output() 删除小部件的版本。

最终您可以使用widget.close() 仅删除一些小部件 - 但它们必须是global 才能在其他功能中访问它们。

from ipywidgets import interact, widgets
from IPython.display import display, clear_output

def faq(q):
    return [["I don't know !!!"]]

def chat(q):
    #global question, answer

    a = faq(q) #FAQ is a function that returns answers to questions
    
    question = widgets.Text(
        value = q,
        disabled=True
    )
    display(question)

    answer = widgets.Textarea(
        value= a[0][0],
        disabled=True
    )
    display(answer)

def input_widget(text, callback):
    #global input_label, input_text, input_box
    
    input_label = widgets.Label(text)
    
    input_text = widgets.Text()
    input_text.on_submit(callback)

    input_box = widgets.HBox([input_label, input_text])
    display(input_box)

def result(event):
    #global btn

    chat(event.value)    
    
    btn = widgets.Button(description='Try again ?')
    btn.on_click(try_again)
    display(btn)

def try_again(event):
    #input_box.close()
    #question.close()
    #answer.close()
    #btn.close()
    clear_output()
    
    ask()
    
def ask():
    input_widget("How can i help you? ", result)
    
ask()

编辑:

版本缩减为两个函数ask_questionget_answer

from ipywidgets import interact, widgets
from IPython.display import display, clear_output

def faq(question):
    return [["I don't know !!!"]]

def get_answer(event):
    question = event.value
    answer = faq(question) 
    answer = answer[0][0]

    chat_question = widgets.Text(
        value = question,
        disabled=True
    )
    display(chat_question)

    chat_answer = widgets.Textarea(
        value= answer,
        disabled=True
    )
    display(chat_answer)

    chat_button = widgets.Button(description='Try again ?')
    chat_button.on_click(ask_question)
    display(chat_button)
    
def ask_question(event=None):
    clear_output()

    input_label = widgets.Label("How can i help you? ")
    
    input_text = widgets.Text()
    input_text.on_submit(get_answer)

    input_box = widgets.HBox([input_label, input_text])
    display(input_box)

ask_question()

【讨论】:

  • 谢谢伙计。像魅力一样工作!但是,目前,我必须等待 5 秒钟才能提交“问题”,否则部分问题不会记录在事件变量中,即不同步。想知道是否有办法解决这个问题..(例如:如果我输入“谁是 Elon Musk”并立即回车,则只会记录“谁是 E”)
  • 我对这段代码没有任何问题 - 我在本地计算机上运行它。如果您在外部计算机上运行它或同时运行其他代码,则问题是计算机速度慢。
猜你喜欢
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多