Как я могу использовать asyncio в сценарии, который я также запускаю как блокнот Jupyter?Python

Программы на Python
Anonymous
Как я могу использовать asyncio в сценарии, который я также запускаю как блокнот Jupyter?

Сообщение Anonymous »

Я часто создаю блокноты Jupyter как простые файлы .py с разделителями ячеек # %%, например:

Код: Выделить всё

# %%
import polars as pl
import numpy as np
# %%
df = pl.read_parquet('my_cool.parquet')
...
Затем я могу запустить это либо как блокнот с помощью vscode-jupyter, либо как скрипт в командной строке.
Однако это не работает, когда я пытаюсь использовать asyncio в своем блокноте. Jupyter ожидает, что вы напишете await на верхнем уровне (с функцией автоматического ожидания), но для запуска в качестве сценария вам необходимо использовать asyncio.run на верхнем уровне:

Код: Выделить всё

# %%
# this works in Jupyter, but in a script you get:
# SyntaxError: 'await' outside function
foo = await my_async_func()
# %%
# this works in a script, but in Jupyter you get:
# RuntimeError: asyncio.run() cannot be called from a running event loop
bar = asyncio.run(my_async_func)
Как написать код, который будет работать в обоих контекстах? Некоторые вещи, которые я пробовал:
  • nest-asyncio: это несовместимо с некоторыми другими библиотеками, которые я использую
  • Код: Выделить всё

    get_ipython().autoawait = False
    перед любым импортом: не исправляет Jupyter
  • с помощью shebang #!/usr/bin/env -S uv run ipython: не исправляет скрипт

Вернуться в «Python»