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

异步函数在.ipynb正常运行但在.py文件中失效求助

解决Binance API异步脚本在.py文件中无法运行的问题

核心原因分析

Jupyter Notebook会自动管理异步事件循环,而普通.py脚本需要手动确保事件循环正确初始化、运行和处理异常。你的脚本仅执行第一个print后卡住,大概率是异步流程中出现未捕获的异常或事件循环未正确启动。

排查与解决步骤

1. 完善异常捕获,定位卡壳环节

在异步函数中添加全面的异常捕获,打印错误详情,确认是客户端创建失败、Socket连接失败还是数据接收环节出问题:

import asyncio
import traceback
from binance import AsyncClient, BinanceSocketManager

async def main():
    print('before await')
    try:
        print("初始化Binance客户端...")
        client = await AsyncClient.create()
        print("客户端创建完成")
        
        bm = BinanceSocketManager(client)
        print("Socket管理器初始化完成")
        
        async with bm.trade_socket('BTCUSDT') as ts:
            print("已订阅BTCUSDT交易数据流,等待接收数据...")
            while True:
                res = await ts.recv()
                print("收到数据:", res)
    except Exception as e:
        print(f"异常信息: {str(e)}")
        traceback.print_exc()
    finally:
        # 确保客户端关闭
        await client.close()

if __name__ == "__main__":
    asyncio.run(main())

2. 检查事件循环兼容性(针对Windows环境)

Windows系统下默认的事件循环策略可能导致异步Socket卡住,手动切换策略:

if __name__ == "__main__":
    import sys
    if sys.platform == 'win32':
        asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
    asyncio.run(main())

3. 验证网络与代理配置

Jupyter可能继承了系统代理配置,但.py脚本运行时环境变量缺失。如果你的环境需要代理,在创建客户端时显式指定:

client = await AsyncClient.create(
    proxies={"http": "http://your-proxy:port", "https": "http://your-proxy:port"}
)

4. 确认依赖库状态

即使版本一致,重新安装依赖确保没有损坏:

pip install --upgrade python-binance asyncio

5. 避免阻塞代码混入异步流程

检查脚本中是否有同步IO操作(如time.sleep()、同步文件读写),这些会阻塞事件循环。替换为异步等价操作(如await asyncio.sleep())。

内容的提问来源于stack exchange,提问作者Juan Paños Basterra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:08:17