所以我正在尝试构建一个使用Binance的API传输BTC数据的脚本,类似于this。然而问题是,在 .ipynb 单元中测试时,以下代码可以完美运行:
import asyncio
import nest_asyncio
from binance.client import Client
from binance import BinanceSocketManager
nest_asyncio.apply()
async def main():
client = Client()
bsm = BinanceSocketManager(client)
socket = bsm.trade_socket('BTCUSDT')
async with socket as ts:
while True:
print('before await')
msg = await ts.recv()
print(msg)
# ---
# loop = asyncio.new_event_loop()
# loop.run_until_complete(main())
asyncio.run(main())
但是,当我将此代码放入 .py 文件中并尝试执行它时,我只能到达第一个 print('before wait') 指令,并且没有显示任何数据。
我正在 .dev 容器内开发 .ipynb 文件和 .py 文件,并且两者都安装了相同的 Python 和库版本。
我尝试过使用不同的指令,例如运行异步函数
loop = asyncio.new_event_loop()
loop.run_until_complete(main())
# instead of
asyncio.run(main())
然而,在这两种情况下,它在 .ipynb 文件中工作得很好,但在 .py 文件中则不然。
我将非常感谢任何帮助,谢谢! :)
在 Windows 10 上对我来说就像一个魅力。
复制您的代码,安装模块。
使用python虚拟环境。
python 3.12.1
python-binance===1.0.19
nest_asyncio===1.5.8
def async_test():
import asyncio
import nest_asyncio
from binance.client import Client
from binance import BinanceSocketManager
nest_asyncio.apply()
async def main():
client = Client()
bsm = BinanceSocketManager(client)
socket = bsm.trade_socket('BTCUSDT')
async with socket as ts:
while True:
print('before await')
msg = await ts.recv()
print(msg)
# ---
# loop = asyncio.new_event_loop()
# loop.run_until_complete(main())
asyncio.run(main())
if __name__ == '__main__':
async_test()
直到 CTRL-C 为止的输出
before await
{'e': 'trade', 'E': 1704466694470, 's': 'BTCUSDT', 't': 3353984451, 'p': '43563.11000000', 'q': '0.00795000', 'b': 24098103240, 'a': 24098103350, 'T': 1704466694469, 'm': True, 'M': True}
before await
{'e': 'trade', 'E': 1704466694733, 's': 'BTCUSDT', 't': 3353984452, 'p': '43563.12000000', 'q': '0.00134000', 'b': 24098103375, 'a': 24098103219, 'T': 1704466694732, 'm': False, 'M': True}
...