为什么 `input` 会生成 `PyodideFuture` 而不是 JupyterLite / Pyodide Kernel 中的字符串?如何才能正确获取输入?

问题描述 投票:0回答:2

我尝试在在线提供的 Jupyter 中运行以下代码:

term_no = input('Enter number of approximations to use: ')
term_no = int(term_no)
print(term_no)

它返回一个错误

TypeError: int() argument must be a string, a bytes-like object or a real number, not 'PyodideFuture'

当我在 VS code 中运行它时,没有错误。 Jupyter 是否存在错误,或者我应该添加一些额外的东西?

python input
2个回答
1
投票

我在这里添加一个答案,即使Matthias的评论涵盖了它,因为它仍然是一个问题。

OP的情况涉及使用JupyterLite/Pyodide内核。目前存在一些限制(请参阅下面的“附加选项 2”下的更多信息),这些限制使得 JupyterLite/Pyodide 内核不同于使用传统完整 Python 内核在 Jupyter 中运行的东西,因此在某些情况下可能需要调整,例如当使用

input()

因此,对于 JupyterLite 和 Pyodide 内核,请尝试编辑代码以添加此

await
,如下所示:

term_no = await input('Enter number of approximations to use: ')

然后在下一个单元格中运行:

term_no = int(term_no)
print(term_no)

此解决方案基于此处

附加选项 1:将代码调整为更优雅的方式来收集用户的号码:

Ipywidgets 在 JupyterLite/Pyodide 内核中工作,并提供了一种更完善的方式来从用户收集信息,重要的是,该代码可在典型的完整 Python 内核 (ipykernel) 和已安装 ipyiwdgets 的 pyodide 中使用。

import ipywidgets as widgets
from IPython.display import HTML
import random

slider = widgets.IntSlider(
    value=0,
    max= 10,
    description= 'Adjust slider to the number of approximations to use:',
    continuous_update=False,
    style= {'description_width': 'initial'},
    layout={'width': '500px'}
)


def on_value_change(change):
    global term_no 
    term_no = slider.value
    output.update(HTML(f"The number of approximations to use is set to: {term_no}"))


output = display(HTML("The number of approximations to use has not yet been set."), display_id=True)
display(slider)

slider.observe(on_value_change, names='value')

可以通过单击 here 在 JupyterLite 中进行尝试,当该会话出现时打开一个新笔记本,让右上角的忙碌指示器变为不忙,然后在单元格中运行

%pip install -q ipywidgets
,然后运行代码例子在这里。您现在必须使用该版本的 JupyterLite,因为 ipywidgets 目前尚未正确安装在稳定的 JupyterLite 中。这是暂时的,最终也将固定在主要的稳定分支这里

请注意,使用这种收集信息的方法,不需要在下一个单元中运行任何内容,这与使用

await input()
的解决方案不同。 您可以在下一个单元中运行以下命令来验证情况确实如此:

print(type(term_no))
print(term_no)

事实上,如果您清除内核,然后使用滑块运行第一个代码,而不实际调整滑块,那么当您尝试使用

NameError
运行单元时,您会很方便地看到
term_no
。这比
input()
方式更方便,因为它在多个关键时刻提供反馈,同时避免挂起运行 Jupyter
.ipynb
文件。

其他选项 2:有关 JupyterLite 的更多详细信息以及调整代码的替代方法

请注意,JupyterLite 仍标记为“实验性”。请参阅“状态”此处,其中警告“并非 JupyterLab 和经典笔记本中提供的所有常用功能都可以与 JupyterLite 配合使用”以及 在试用 Jupyter 页面上,请注意 突出显示的“实验”警告
您可以在线将 MyBinder 用于典型的基于 Python 的内核,而无需登录或在计算机上安装任何内容。转到此处并单击“启动 Binder”或只需单击此处即可启动临时会话。您可以拖放到左侧的文件导航面板中,将正在进行的 Jupyter

.ipynb
文件从本地计算机上传到远程临时会话。请记住,这是远程虚拟计算机上的临时会话;没有持久性,因此您希望尽快将您制作的任何有用内容下载回本地系统。


-1
投票

Working in Jupyter 您的原始代码可以在 Jupyter 中运行

© www.soinside.com 2019 - 2024. All rights reserved.