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

Jupyter可运行异步代码在本地Python脚本报SyntaxError问题求助

异步下载脚本问题的原因及解决方法

错误原因拆解

  1. SyntaxError: 'await' outside function
    Jupyter Notebook(IPython)支持顶层await语法,允许在代码单元格的最外层直接使用await调用协程;但标准Python脚本不支持该特性,await只能出现在async定义的函数内部,或通过asyncio.run()来驱动协程执行。

  2. RuntimeWarning: coroutine 'download' was never awaited
    async函数被调用后不会立即执行,而是返回一个协程对象。如果不通过await(在async函数内)或asyncio.run()触发执行,协程永远不会运行,因此会抛出该警告。

  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:25:34