[prg] Отладчик для дополнений NVDA

Приветствую.

нужно обращаясь к элементу списка по его индексу передать содержимое
этого элемента в NVDA.

На чистом Python всё работает, через дополнение нет. Пытаюсь сделать
типа такое:

mylist = [abc, defg, 12345, wxyz]

indexlist = mylist[0]

ui.message(indexlist)

И тишина.

Пробовал и ui.message(mylist[0]) тоже тишина.

Вот хочу узнать как лучше передать элемент списка или словаря на скринридер.

Ответить   Sat, 9 Jan 2021 02:52:53 +0200 (#3663541)

 

Ответы:

Здравствуйте, Dmitriy.

На чистом Python этот код точно работать не будет, потому что там нет модуля
ui.
Ну а в NVDA этот код в принципе должен работать, но как часть чего-то
большего. Если это код из дополнения, то надо смотреть на остальную часть.
Если из консоли Python в NVDA, то надо определиться с переменными или
литералами в списке и убедиться, что импортирован модуль ui.
Однако в консоли Python в NVDA есть нюанс, из-за которого ui.message() там
использовать не стоит, а лучше использовать стандартную функцию print().
Просто сообщение ui.message() прерывается сообщением чтения объявления для
ввода новой строки, когда эта строчка дописывается в окне редактора.
То есть ui.message() в консоли Python отрабатывает, но тут же перебивается
новым сообщением, так что обычно там этого не слышно.

Эти сообщения попадают в журнал NVDA, который можно просмотреть по команде
NVDA+F1.
Также можно открыть файл %tmp%\nvda.log
Если сбой произошёл в предыдущей рабочей сессии NVDA, то смотреть надо файл
%tmp%\nvda-old.log
Успехов. Никита.

Ответить   Sun, 10 Jan 2021 03:13:11 +0300 (#3663560)

 

Понятно. То есть типа как в консольном варианте дополнение запустить
невозможно? Т.Е. чтоб не бегать каждый раз в журнал.

Допустим основной код я напишу с обычным Python, но я ведь могу
ошибиться в библиотеках NVDA.

И вот приблизительно из первого вопроса возник второй.

Можно ли как-то запускать дополнение так, чтобы не перегружать все
остальные дополнения.

Скорей всего я делаю не так, но я кладу дополнение в профиль NVDA туда
где оно и будет после установки и после каждой малейшей поправки в коде
нажимаю nvda+ctrl+f3. И это очень не удобно особенно если кто-то сидит
на удалёнке по NVDA remote.

Можно ли перезапускать только одно дополнение?

Может будет лучше импортировать библиотеки из nvda в чистый python и
работать так? Короче я не знаю, вот и интересуюсь как лучше сделать.
Просто привык к чистому Python, к его консоли и моментальному выводу
ошибок если таковые есть.

Да, и ещё вопрос по отладке. Я сейчас работаю с интернет-базой данных. В
обычном python я могу посмотреть что подгрузилось в переменные к примеру
к сорок седьмой строке кода, с помощью команд "next", "step" и так
далее. могу ли я узнать это в NVDA?

То есть даже если я подключу библиотеку отладчика в NVDA, как я это
посмотрю если Nvda в консоли ничего не показывает?

Ответить   Sun, 10 Jan 2021 03:29:09 +0200 (#3663566)

 

Здравствуйте, Dmitriy.

NVDA в принципе не консольное приложение, поэтому без GUI многие вещи просто
работать не будут. То есть их чисто в консоли не запустить.
Отладка работы идёт через журнал, подробность сообщений которого можно
настроить.
Вызовы print() в исполняющемся коде дополнения попадают в журнал. Также
можно вставлять вызовы raise, то есть инициировать исключение, которое
остановит исполнение в этой точке и запишет текст в журнал.

Если у вас будет ошибка исполнения, то информацию о ней вы увидите в
журнале.
Если же у вас ошибка в логике работы, то обкладывайте код тестами или
отлаживайте на print'ах, то есть выводя через print() по ходу исполнения
сообщения с технической информацией и таким образом находя этап, на котором
что-то пошло не так.
В принципе, можно запустить NVDA из исходников и получить чуть больше
контроля за процессом исполнения, но это оправдано, если вы куда-то совсем
залезли в ядро NVDA.
Ещё NVDA может быть собрана в бинарном виде в режиме отладки, когда на
разные ошибки на будет явно подавать сигналы.
В принципе, достаточно просто взять какую-нибудь готовую бета-версию,
которая именно так и собрана.

В рамках стандартной функциональности NVDA нет.
Чисто теоретически можно написать свой собственный перезагрузчик конкретного
дополнения, почитав реализацию общей перезагрузки в исходниках NVDA. Точка
входа для поиска соответствующего скрипта в файле globalCommands.py, ну а
дальше уже смотреть по коду.
Однако с учётом необходимости в том числе сброса кэша динамически
создаваемых объектов это вряд ли задача, с которой стоит связываться.
Больше похоже на то, что у вас просто не очень эффективно построен рабочий
процесс, и лучше заняться его оптимизацией.
В частности, вызывает некоторые сомнения вся эта история с отладкой на
удалённой машине по NVDA Remote.

Такое впечатление, что вы занимаетесь разработкой чего-то за рамками
профильной функциональности NVDA.
То, что имеет смысл программировать на уровне дополнения NVDA, по сути в
подавляющем большинстве случаев должно быть так тесно связано со всем
окружением и интерфейсом NVDA, что именно в этом виде это и должно быть
наиболее удобно отлаживать.
Если же у вас просто некое стороннее Python-приложение, просто выдающее
результат своей работы в интерфейс NVDA, ну и всё это планируется запускать
на интерпретаторе Python, встроенном в NVDA, то тут появляются вопросы
оправданности такого архитектурного решения.
В любом случае, если у вас достаточно много кода, который реализует
абстрактную логику, никак не связанную с окружением NVDA, то аккуратно
вынесете его в отдельные модули с нейтральным API, ну и отлаживайте в
обычной консоли Python. Потом уже просто после отладки положите их в
дополнение и импортируете, а в NVDA отладьте только тонкую прослойку
интеграции этих модулей в окружение NVDA.

См. выше про уместность написания и запуска приложений общего назначения на
внутреннем Python-интерпретаторе NVDA.
Ну а вообще если запускать NVDA из исходников без компиляции, то возможно у
вас и получится сделать то, что вы хотите, то есть пошагово отладить
Python-код прямо в основном потоке исполнения NVDA.
Инструкцию с перечислением зависимостей и особенностями запуска NVDA из
исходников можно посмотреть в ReadMe её репозитория на GitHub.
Успехов. Никита.

Ответить   Sun, 10 Jan 2021 18:22:29 +0300 (#3663568)

 

Приветствую.

Попробовал консоль nvda, Возможно странно, но появились вопросы.

Как очистить консоль от результатов работы не перезапуская скринридер?

То есть если даже закрыть консоль, потом снова её открыть, в тех же
переменных будут храниться данные. Неужели очищать командой каждую
переменную?

И ещё. Обычной, физической мышкой переместил курсор на результат работы
и перешёл в редактор только для чтения, где стрелками можно ходить и
видеть что ты вводил и то что выводилось в результате, случайно обратил
на это внимание. А вот с клавиатуры как так сделать, понять теперь не могу.

Если открыть консоль Python в Nvda, то стрелками я перемещаюсь только по
командам которые я вводил и это обычный редактор, в котором nvda не
читает результаты вывода. А так прикольно получилось, если кто знает
подскажите как перейти в такой режим с клавиатуры?

Ответить   Sun, 10 Jan 2021 04:39:24 +0200 (#3663567)

 

Здравствуйте, Dmitriy.

Боюсь, что никак. Консоль Python в NVDA - это инструмент отладки, а не
просто терминал для встроенного интерпретатора.
Там как бы одна рабочая сессия в течение рабочей сессии NVDA.
Вызов консоли в NVDA - это не запуск интерпретатора, а просто показ его
окна, так-то он один раз запускается с NVDA и потом с ней же завершается.

Так у вас тоже самое происходит и с обычным Python, когда вы работаете
внутри одной сессии.
Вообще-то в Python есть встроенный сборщик мусора, так что если на
какой-либо объект в коде не осталось ссылок, то он автоматически удаляется.
Ну или перемалывайте данные внутри функции/метода в переменных локальной
области видимости, если у вас какие-то проблемы с застреванием значений в
памяти.

могу.

Циклично по F6.
Успехов. Никита.

Ответить   Sun, 10 Jan 2021 18:23:14 +0300 (#3663569)