回调函数不打印,除非由 Jupyter 运行

Posted

技术标签:

【中文标题】回调函数不打印,除非由 Jupyter 运行【英文标题】:callback function doesn't print, unless ran by Jupyter 【发布时间】:2022-01-24 02:50:39 【问题描述】:

这是重现问题所需的最少代码。

我调用一个带有回调函数的 API,该函数打印出 API 调用的结果。

如果我在 Jupyter 中运行此代码,我会得到输出。如果我用python file.py 运行它,我不会得到任何输出。我已经检查了 API 的代码,但这并没有什么奇怪的。将DEBUGGING 设置为True 也无济于事。

注意有一次依赖; Bitvavo API。使用pip install python-bitvavo-api安装它

# %%
from python_bitvavo_api.bitvavo import Bitvavo

# %%
def generic_callback(response):
    print(f"log function=get_markets, response=")

bitvavo = Bitvavo("DEBUGGING": False)
websocket = bitvavo.newWebsocket()

# %%
websocket.markets(options="market": "BTC-EUR", callback=generic_callback)

这是我从 Jupyter 得到的预期输出:

log function:get_markets, response='market': 'BTC-EUR', 'status': 'trading', 'base': 'BTC', 'quote': 'EUR', 'pricePrecision': 5, 'minOrderInBaseAsset': '0.0001', 'minOrderInQuoteAsset': '5', 'orderTypes': ['market', 'limit', 'stopLoss', 'stopLossLimit', 'takeProfit', 'takeProfitLimit']

【问题讨论】:

【参考方案1】:

因为你使用的是websocket,所以回调是由不同的线程执行的,这意味着如果你不等待,主线程(即接收print的输出)将已经被杀死.

在末尾添加sleep(1)(这是秒,而不是毫秒),输出将显示。

PS:Jupyter 确实显示输出的原因是因为 Jupyter 始终保持交互式窗口打开,即使在您运行代码很久之后 :)

【讨论】:

【参考方案2】:
import time
from python_bitvavo_api.bitvavo import Bitvavo

# %%
def generic_callback(response):
    print(f"log function=get_markets, response=")

bitvavo = Bitvavo("DEBUGGING": False)
websocket = bitvavo.newWebsocket()

# Wait N.1 required to receive output, otherwise the main thread is killed
time.sleep(1)

# %%
websocket.markets(options="market": "BTC-EUR", callback=generic_callback)

# Wait N.2 required to receive output, otherwise the main thread is killed
time.sleep(1)

【讨论】:

@NostraDavid 如果我或其他用户的回答是您问题的解决方案,请接受 *** 帮助中心规则的回答,谢谢

以上是关于回调函数不打印,除非由 Jupyter 运行的主要内容,如果未能解决你的问题,请参考以下文章

JS异步编程,回调函数与promise

函数上的javascript回调[关闭]

js中的回调函数

lwIP 细节之三:TCP 回调函数是何时调用的(编辑中)

OpenCV鼠标事件详解-深入理解回调函数

回调函数(借鉴)