Отладка асинхронной программы в отладчике pycharmPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Отладка асинхронной программы в отладчике pycharm

Сообщение Anonymous »

Мой запрос — получить отладочные данные из отладчика и приглашения pycharm:

Предположим, у меня есть синхронная программа Python старого стиля с ошибкой: р>

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

   def listdir(self, remote_path):
with ssh.connect(self.connection_settings['host'], username=self.connection_settings['username'],
password=self.connection_settings['password']) as conn:
with conn.start_sftp_client() as sftp:
sftp.chdir(remote_path) # breakpoint here

files = sftp.readdir()
files_name = [file.filename for file in files]

return files_name

Я бы остановил это, зашел в отладчик, щелкнул консоль отладчика->показать приглашение Python
а затем отладил свои проблемы во время выполнения:

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

> sftp.getcwd()
bad_user_location
> sftp.chdir(good_base_location)
> sftp.readdir()
Просто переписываю код на лету и проверяю состояние и время выполнения. (Так я всегда делал отладку, используя непосредственное окно при разработке языков Microsoft и REPL в Python и других скриптовых языках.

Теперь у меня есть асинхронная программа:

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

  async def listdir(self, remote_path):
async with asyncssh.connect(self.connection_settings['host'], username=self.connection_settings['username'],
password=self.connection_settings['password']) as conn:
async with conn.start_sftp_client() as sftp:
await sftp.chdir(remote_path)  # breakpoint here

files = await sftp.readdir()
files_name = [file.filename for file in files]

return files_name

Я останавливаю его, перехожу к отладчику, нажимаю консоль отладчика->показать приглашение Python
а затем отлаживаю свои проблемы во время выполнения:

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

> sftp.getcwd()
Я установил IPython 7, который поддерживает event_loop, но он не запускает задачу, просто добавляется в цикл событий, поскольку он создан для Jupyter, а не для этого варианта использования.
[*]Я попробовал создать новое событие цикл, но в потоке может быть только один цикл.
[*]Я попробовал использовать Nest_asyncio и применить, но >[code]nest_asyncio.events.new_event_loop().create_task(sftp.getcwd())
но он просто добавляет его в цикл, а не запускает. d.run_sync(sft.chdir(somewhere_else))
0 # exit code
[/code]

Я нашел в Channels v2.0 что-то подобное в замечательной статье Эндрю Гадвинса

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

   >asgiref.sync.async_to_sync(sftp.getcwd())
> ... created at :1> was never yielded from
>ERROR:asyncio:

Подробнее здесь: [url]https://stackoverflow.com/questions/61771874/debugging-an-async-program-in-the-pycharm-debugger[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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