[Решено] LibreOffice: Отладка макросов Python

Автор ost, 10 августа 2022, 20:51

0 Пользователи и 1 гость просматривают эту тему.

ost

Доброго.
В ходе отладки Python-скрипта в дебагере APSO нахожу ошибку, которую правлю во внешнем редакторе.
Как, не закрывая LibreOffice, заставить интерпретатор Python из поставки LO увидеть эти правки.

Спасибо.

economist

1) В APSO_DEBUG жмете Alt+A или кнопку RESTART и правленный во внешней IDE/Vim/Far/Блокноте файл перезагружается и готов к новой отладке.  Или выполнению по кнопке RETURN.

2) На ютьбе был часовой видос с конфы зарубежом, где у людей отладка была прямо в IDE типа PyСharm/Atom/VisualStudioCode. Искать по запросу LibreOffice Python Development.

3) Другой способ - ставится обычный Python той же версии и через sys.path.append подключается папка LO Python c UNO.

Сам 2/3 не пробовал, UNO не осилил. Пишу так, чтобы скрипт работал и во внешнем, и во внутреннем питоне. Для этого нужно оформлять код модуля (файла .py) в виде функций, а в конце писать конструкцию:


if __name__=='__main__':
    main_func()
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

ost

#2
Очевидно, я не был точен.
Нажатие кнопки "RESTART" позволяет перезапустить, запущенный в дебагере Python-скрипт, и правки, внесенные в него становятся доступны.
Однако, нажатие кнопки "RESTART" не помогает при внесении изменений в скрипты, импортированные (нативно для Python) в скрипт, запущенный в дебагере.

Поясню.
В библиотеке Library_py (каталог, лежащий в каталоге пользователя LO на локальной машине и доступный из меню LO Calc > Сервис > Макросы > Выполнить макрос > Мои) макросы лежит python-модуль "start01.py" следующего содержания:

print("started module: 'start01.py'")
# coding: utf-8
from __future__ import unicode_literals
import sys


def add_paths():
   ev = "path"
   pths_chck = [r"n:\py\projects\ar\ar_lib"]
   if ev == "path":
       [sys.path.append(pth) for pth in pths_chck if not pth in sys.path]
       import main_lo
       main_lo.test01()

который добавляет в переменную окружения "path" путь до сетевого каталога "ar_lib", где хранятся все python-модули проекта, в том числе и модуль "main_lo.py", который, в свою очередь, импортиуется в "start01.py" и содержит:

print("started module: 'main_lo.py'")
# coding: utf-8
from __future__ import unicode_literals


def test01():
   import sub1, sub2

   sub1.s1()
   sub2.s2()


Все импорты работают. Но изменения, внесенные в код файлов "main_lo.py" и, тем более, "sub1.py", "sub2.py", недоступны до рестарта LO.







economist

Python ленив при импорте. Если такой объект уже есть в памяти - он не обновляется.
Добавьте в start01.py перед строками импорта "удалялку" модулей из оперативной памяти:  

import sys
del sys.modules['main_lo']
del sys.modules['sub1']
del sys.modules['sub2']

Сами файлы никуда не денутся, но тексты модулей должны обновиться.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

ost

Строка del sys.modules['main_lo'] до строки import main_lo вызывает окошко с ошибкой KeyError: 'main_lo'
Воспользовался методом reload() python-модуля importlib (есть в python из поставки LO)
Строчку reload() добавляю после каждого импорта.
Получилось нечто такое
print("started module: 'start01.py'")
# coding: utf-8
from __future__ import unicode_literals
import sys
from importlib import reload


def add_paths():
    ev = "path"
    pths_chck = [r"n:\py\projects\ar\ar_lib"]
    if ev == "path":
        [sys.path.append(pth) for pth in pths_chck if not pth in sys.path]
        import main_lo

        reload(main_lo)

        main_lo.test01()

Работает. Для отладки - вполне себе.