异步函数在.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
相关产品推荐
相关产品推荐

