Cloudflare Worker执行Python代码需求及报错排查咨询
问题分析与解决方案
可行性说明
这个需求是可行的,但要注意Cloudflare Worker的Python运行环境基于Pyodide,和本地Python环境存在差异——不能直接使用subprocess这类依赖系统进程的模块,得改用Pyodide内置的代码执行方式,同时要处理异步的请求体解析逻辑。
报错原因
你碰到的'PyodideFuture' object has no attribute 'get'错误,核心原因是request.json()是异步方法,返回的是PyodideFuture对象(类似JavaScript的Promise),不能直接调用.get(),必须用await等待它完成才能拿到真正的JSON数据。
另外,subprocess模块在Cloudflare Worker的Pyodide环境中完全不可用,这里没有独立的Python进程可以启动,必须换用Pyodide原生的代码执行方式。
修正后的代码
from js import Response import sys from io import StringIO async def on_fetch(request): try: # 异步解析请求体的JSON数据 body = await request.json() code_to_execute = body.get("code", "") # 重定向标准输出,捕获代码执行结果 old_stdout = sys.stdout captured_output = StringIO() sys.stdout = captured_output try: # 直接执行传入的Python代码 exec(code_to_execute) finally: # 恢复标准输出,避免影响后续请求 sys.stdout = old_stdout # 获取捕获的输出内容并返回 output = captured_output.getvalue() return Response.new(output, {"status": 200}) except Exception as e: return Response.new(f"执行代码出错: {str(e)}", {"status": 500})
关键改动说明
- 将
on_fetch改为异步函数,用await处理request.json()的异步结果,直接解决PyodideFuture的报错问题。 - 移除
subprocess模块,改用exec直接执行代码,通过重定向sys.stdout来捕获输出,这是Pyodide环境中获取代码执行输出的正确方式。 - 添加
finally块确保标准输出被恢复,避免后续请求的输出逻辑受影响。
内容的提问来源于stack exchange,提问作者Johanan S A
相关产品推荐
相关产品推荐

