Jupyter可运行异步代码在本地Python脚本报SyntaxError问题求助
异步下载脚本问题的原因及解决方法
错误原因拆解
SyntaxError: 'await' outside function
Jupyter Notebook(IPython)支持顶层await语法,允许在代码单元格的最外层直接使用await调用协程;但标准Python脚本不支持该特性,await只能出现在async定义的函数内部,或通过asyncio.run()来驱动协程执行。RuntimeWarning: coroutine 'download' was never awaited
async函数被调用后不会立即执行,而是返回一个协程对象。如果不通过await(在async函数内)或asyncio.run()触发执行,协程永远不会运行,因此会抛出该警告。UnboundLocalError: local variable '_jsfetch' referenced before assignment
pyfetch是Jupyter环境专属的异步请求工具,标准本地Python环境默认没有这个库,即使手动安装,其实现也和Jupyter内置版本不一致,导致内部依赖的_jsfetch变量未正确初始化。
完整解决代码
使用Python生态通用的异步HTTP库aiohttp替代pyfetch,跨环境兼容:
步骤1:安装依赖
pip install aiohttp
步骤2:修改后的代码
import asyncio import aiohttp async def download(url, filename): # 创建异步会话 async with aiohttp.ClientSession() as session: # 发起异步GET请求 async with session.get(url) as response: if response.status == 200: # 读取响应二进制内容并写入文件 with open(filename, "wb") as f: f.write(await response.read()) path = 'https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork/labs/Module%204/data/Cust_Segmentation.csv' # 运行顶层协程 asyncio.run(download(path, "Cust_Segmentation.csv"))
代码说明
aiohttp.ClientSession是异步HTTP请求的会话管理器,负责连接池等资源管理;session.get(url)发起异步GET请求,通过async with自动管理请求生命周期;response.read()异步读取响应的二进制内容,替代原代码中的response.bytes();asyncio.run()是Python 3.7+提供的顶层协程运行入口,负责创建事件循环并执行协程。
内容的提问来源于stack exchange,提问作者Michael Emerson
相关产品推荐
相关产品推荐

