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

如何解决Streamlit按钮传参给Playwright Python脚本时出现的NotImplementedError问题

如何解决Streamlit按钮传参给Playwright Python脚本时出现的NotImplementedError问题

嘿,我之前也踩过这个坑!问题根源其实很明确:Streamlit的运行环境是基于异步事件循环的,而你用的Playwright同步API(sync_playwright())是为纯同步Python场景设计的,直接在Streamlit的异步上下文里调用同步API就会触发NotImplementedError。下面给你两种可行的解决办法:

方法一:改用Playwright异步API适配Streamlit环境

把你的Playwright代码改成异步版本,和Streamlit的异步模型完全兼容:

修改script.py为异步版本

from playwright.async_api import async_playwright

async def web_script(site):
    async with async_playwright() as p:
        browser = await p.chromium.launch()
        page = await browser.new_page()
        await page.goto(site)
        # 可以把结果输出到Streamlit界面,比print更直观
        st.write("页面标题:", await page.title())
        await browser.close()

修改main.py调用异步函数

Streamlit支持直接执行异步函数,或者用asyncio.run来触发:

import streamlit as st
import asyncio
from script import web_script

site='https://www.google.com/'

if st.button("Send"):
    asyncio.run(web_script(site))

方法二:用线程隔离同步Playwright代码

如果你不想改动现有同步代码,也可以把Playwright的同步逻辑放到单独线程里执行,避开Streamlit的异步上下文限制:

修改main.py添加线程包装

import streamlit as st
import threading
from script import web_script

site='https://www.google.com/'

def run_sync_in_thread(func, *args):
    # 创建独立线程执行同步函数
    thread = threading.Thread(target=func, args=args)
    thread.start()
    thread.join()

if st.button("Send"):
    run_sync_in_thread(web_script, site)

额外注意事项

  • 先单独运行script.py测试,确认Playwright本身能正常启动浏览器、访问页面,排除驱动未安装的问题(如果没装驱动,执行playwright install即可)。
  • 用线程方法时,不要在多个线程里共享同一个浏览器实例,每个线程单独创建和关闭浏览器,避免线程安全问题。
  • 如果用异步方法,建议保持Streamlit版本为最新,新版本对异步函数的支持更稳定。

备注:内容来源于stack exchange,提问作者Sergio Alexandre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 10:10:30