如何解决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
相关产品推荐
相关产品推荐

