You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Py-Script中如何正常使用input()函数?求替代方案

在浏览器中运行含input()的Python代码:PyScript问题解决与替代方案

问题概述

在PyScript标签中使用Python内置input()函数时,会出现加载界面关闭前弹出输入提示,必须完成输入才会关闭加载界面的问题。尝试用JavaScript的Promise、文本输入框和按钮替代input(),但PyScript不会等待Promise解析,直接返回None。试过Skulpt、Flask+Ajax方案,均未解决,需要找到可行的浏览器端Python交互输入方案。

用户尝试的代码示例:

原生PyScript input()调用

<py-script>
    user_input = input("what is your name")
    print(user_input)
</py-script>

尝试调用自定义JS input函数

<py-script>
from js import input
user_input = input("what is your name?")
# 此处调用的是JS中定义的input函数,而非Python内置函数
</py-script>

自定义JS逻辑

var flag = false;
function click() {
    flag = true;
}
function waitUntilTrue() {
    return new Promise(resolve => {
      const check = () => {
        if (flag == false) {
          resolve();
        } else {
          setTimeout(check, 100);
        }
      };
      check();
    });
}
function input(prompt) {
    $("#show-question").text(prompt);
    waitUntilTrue();
    var userInput = $("#submit-input").val();
    return userInput;
}

可行解决方案

1. 修正PyScript与JS Promise的异步交互逻辑

你的JSinput()函数未正确等待Promise完成就返回值,导致PyScript拿到undefined(对应Python的None)。需修改为异步函数,并在PyScript中使用await等待结果:

步骤1:添加HTML交互区域

<div id="prompt-area">
  <p id="show-question"></p>
  <input type="text" id="submit-input">
  <button onclick="submitUserInput()">提交</button>
</div>

步骤2:修改JS异步逻辑

let inputResolver;

function submitUserInput() {
  const inputVal = document.getElementById('submit-input').value;
  if (inputResolver) {
    inputResolver(inputVal);
    inputResolver = null;
    document.getElementById('submit-input').value = '';
  }
}

// 暴露给Python的异步input函数
window.input = function(promptText) {
  document.getElementById('show-question').textContent = promptText;
  return new Promise(resolve => {
    inputResolver = resolve;
  });
}

步骤3:PyScript中使用await等待结果

<py-script>
import asyncio
from js import input

async def fetch_input():
    user_input = await input("what is your name?")
    print(user_input)

asyncio.ensure_future(fetch_input())
</py-script>

2. 使用PyScript原生交互组件

PyScript提供了py-input等原生组件,可直接实现交互:

<py-input id="name-input" placeholder="输入你的名字"></py-input>
<button onclick="triggerInput()">提交</button>

<py-script>
from pyodide.ffi import create_proxy
from js import document

def handle_submit(event):
    user_input = document.getElementById("name-input").value
    print(user_input)

document.getElementById("name-input").addEventListener("change", create_proxy(handle_submit))
</py-script>

3. 替代方案:直接使用Pyodide

如果PyScript不符合需求,可直接用其底层依赖Pyodide手动管理环境与交互:

<script src="https://cdn.jsdelivr.net/pyodide/v0.25.0/full/pyodide.js"></script>
<div>
  <p id="prompt-text"></p>
  <input id="user-input-box" type="text">
  <button id="submit-button">提交</button>
</div>
<script>
async function initPy() {
  const pyodide = await loadPyodide();
  
  // 向Python环境注入异步input函数
  pyodide.globals.set("input", async (prompt) => {
    document.getElementById("prompt-text").textContent = prompt;
    return new Promise(resolve => {
      document.getElementById("submit-button").onclick = () => {
        resolve(document.getElementById("user-input-box").value);
        document.getElementById("user-input-box").value = '';
      };
    });
  });
  
  // 运行带input的Python代码
  await pyodide.runPythonAsync(`
    import asyncio
    async def main():
        user_input = await input("what is your name?")
        print(user_input)
    asyncio.run(main())
  `);
}
initPy();
</script>

内容的提问来源于stack exchange,提问作者RaidRider

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 02:52:49