Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Зачем и boot.py, и main.py?

Тема в разделе "MicroPython", создана пользователем RotaryF, 28 фев 2019.

  1. RotaryF

    RotaryF Новичок

    Сообщения:
    12
    Симпатии:
    0
    Вот и я взглянул в сторону микроПитона, благо под рукой и ESP8266, и ESP32.
    Успел и поиграться малость с лампочками+, даже некое подобие Cron(a) под свои нужды наваял.
    Для более полного понимания "процесса" хочу выяснить нафиг такая 2х-ступенчатая процедура загрузки, зачем этой змейке 2 файла? Какая разница произведу ли я полную инициализацию своей системы только в boot.py или же задействую и boot.py, и main.py?
    Ну да, гибче, а как эту улучшенную (по ср., скажем, с Lua-init) гибкость грамотно использовать?
    Все равно хоть после программной перезагрузки, хоть после глубокого сна процедура одинакова - перезапускаются и boot.py, и main.py :confused:
     
  2. nikolz

    nikolz Гуру

    Сообщения:
    4.156
    Симпатии:
    431
    читайте документацию там все есть про "нафига"
     
  3. __ab__

    __ab__ Новичок

    Сообщения:
    21
    Симпатии:
    2
    чтобы ответ был полезен, а не был просто троллингом, обычно дают ссылки или цитаты,, если упоминают документацию.
    мне известно вот это место в документации 3. The internal filesystem — MicroPython 1.9.3 documentation
    пункт 3.3
    И документация в этом месте врет - main.py не и импортируется самим python - его надо явно импортировать из boot.py
    Если знаете другое упоминание в документации, приведите ссылку пожалуйста.

    Зачем все же это разделение? Чтобы стимулировать программиста не пытаться отъедать ресурсы прикладной логикой в случае, если необходимые системные функции не загрузились.

    Я обычно меняю boot.py на вот такой:
    Код (Text):
    1. import gc, webrepl, esp, network, json, os, time
    2. MAIN=None
    3.  
    4. #В файле config.json держим логин и пароль сети
    5. #{"wlan_pwd": "XXXX", "wlan": "XXXX"}
    6.  
    7. def init():
    8.     global MAIN
    9.     lst = os.listdir()
    10.     if 'config.json' in lst:
    11.         try:
    12.             with open('config.json', 'r') as x:
    13.                 cfg = json.load(x)
    14.         except:
    15.             return
    16.  
    17.     if 'wlan' in cfg:
    18.         wlan = network.WLAN(network.AP_IF)
    19.         wlan.active(False)
    20.  
    21.         wlan = network.WLAN(network.STA_IF)
    22.         wlan.active(True)
    23.         wlan.connect(cfg['wlan'], cfg['wlan_pwd'])
    24.  
    25.         x = 0 # 10 секунд ждем соединения WiFi
    26.         while x < 10:
    27.             if wlan.isconnected():
    28.                 webrepl.start()
    29.                 break
    30.             x += 1
    31.             time.sleep(1)
    32.  
    33.     # если есть main пытаемся запустить
    34.     if 'main.py' in lst:
    35.         MAIN = __import__('main')
    36.         lst = dir(MAIN)
    37.         if 'init' in lst:
    38.             MAIN.init()
    39.  
    40. esp.osdebug(None)
    41. init()
    42. gc.collect()
    ну а в main и прочих модулях - логика, которая просто не сможет работать, ели не отработало то, что есть в boot
     
    RotaryF нравится это.
  4. RotaryF

    RotaryF Новичок

    Сообщения:
    12
    Симпатии:
    0
    Вот, это уже больше похоже на ответ и желание помочь.
    А предыдущее "по документации" смахивает на х.з., но с умным видом :cool:
     
  5. RotaryF

    RotaryF Новичок

    Сообщения:
    12
    Симпатии:
    0
    Думаю, что тему можно закрывать, но напоследок я скажу (на основании своего опыта). ;)
    "Исторически так сложилось". Возможно, разработчики чего там замышляли для усиления безопасности системы, но толку от этого хрен да ни хрена.
    boot.py "первоначально автоматически создается системой" и рекомендуют туда лишний раз не лезть (если вам ни приспичит поиграться с WEBrepl). При этом файл никак не защищен от изменений o_O, так что при желании(?) переносите туда весть свой функционал main.py, но традиции есть традиции - зачем их без надобности нарушать? Делайте основное управление своей системой в main.py и будет вам счастье.
    Связка boot.py-main.py вполне себе работает (если не дергаться) и пусть себе работает :D
     
  6. apatrushev

    apatrushev Новичок

    Сообщения:
    3
    Симпатии:
    0
    Ваш код сломается неприятным образом если не будет файла config.json
     
  7. __ab__

    __ab__ Новичок

    Сообщения:
    21
    Симпатии:
    2
    Более того, он вообще не будет работать, если не залить его в файл boot.py ;)
    Не вижу большой проблемы в том, чтобы перед началом работы залить файлы boot и config...

    а еще можно так:
    Код (Text):
    1. if 'config.json' in lst:
    2.         try:
    3.             with open('config.json', 'r') as x:
    4.                 cfg = json.load(x)
    5.         except:
    6.             return
    7. else:
    8.         cfg = {}
     
  8. apatrushev

    apatrushev Новичок

    Сообщения:
    3
    Симпатии:
    0
    Так лучше, да. Просто "дурако-устойчивый код" это хорошо. Кто-то может залить его через webrepl, например, и ресетнуть девайс. После чего будет весьма удивлён. Я вот как-то так поправил ваш код. Теперь "экстренная связь" с устройством будет даже в случае проблем.
    Я сам этот код лично ещё не проверил - проверю, удалю этот дисклеймер.
    Код (Text):
    1. import gc, webrepl, esp, network, json, os, time
    2.  
    3. # config.json example
    4. # {
    5. #     "wlan": {"ssid": "XXX", "password": "XXX"},
    6. #     "webrepl": {"port": "III", "password": "XXX"}
    7. # }
    8.  
    9. def init():
    10.     try:
    11.         with open('config.json', 'r') as fd:
    12.             cfg = json.load(fd)
    13.     except (OSError, ValueError):
    14.         return webrepl.start()
    15.  
    16.     webrepl_config = cfg.get('webrepl', {})
    17.     webrepl.start(**webrepl_config)
    18.     if 'wlan' in cfg:
    19.         sta = network.WLAN(network.STA_IF)
    20.         sta.active(True)
    21.         sta.connect(cfg['wlan']['ssid'], cfg['wlan']['password'])
    22.         while not sta.isconnected():
    23.             time.sleep(0.1)
    24.         webrepl.stop()
    25.         ap = network.WLAN(network.AP_IF)
    26.         ap.active(False)
    27.         webrepl.start(**webrepl_config)
    28.  
    29.     if 'main.py' in os.listdir():
    30.         main = __import__('main')
    31.         lst = dir(main)
    32.         if 'init' in lst:
    33.             main.init()
    34.  
    35. esp.osdebug(None)
    36. init()
    37. gc.collect()
    38.  
     
  9. nikolz

    nikolz Гуру

    Сообщения:
    4.156
    Симпатии:
    431
    размечтался.
    попробуй,
    удали.
     
  10. __ab__

    __ab__ Новичок

    Сообщения:
    21
    Симпатии:
    2
    Совершенно не обязательно - ведь:
    1) в любом параметре можно ошибиться.
    2) на ESP32 это работать не будет, т.к. в отличие от 8266 она не запоминает имени и пароля точки доступа, соответственно инициализация webrepl не сработает до кода:
    Код (Text):
    1. if 'wlan' in cfg:
    2.         sta = network.WLAN(network.STA_IF)
    3. .....
    И я бы не стал очень сильно увлекаться дурако-устойчивостью : любые вычисления требуют ресурсов, в том числе и обеспечивающие устойчивость. На устройстве, в ресурсах ограниченном, лучше лишнего не писать...

    Да и вот это вот не очень код:
    Код (Text):
    1.     webrepl.start(**webrepl_config)
    2.     if 'wlan' in cfg:
    3.         sta = network.WLAN(network.STA_IF)
    4.        .....
    5.         webrepl.start(**webrepl_config) # зачем ?
    6.  
    Кстати, webrepl и так неплохо инциализируется из своего конфига, так что я, в плане webrepl, не стал бы что-то менять в и так неплохо работающем коде ;)
     
  11. nikolz

    nikolz Гуру

    Сообщения:
    4.156
    Симпатии:
    431
    что мешает на ESP32 запомнить имя и пароль точки доступа?
     
  12. __ab__

    __ab__ Новичок

    Сообщения:
    21
    Симпатии:
    2
    Прошивки micropython несколько разные на 32 и 8266 - одна сохраняет, а другая - нет.
    При этом смысла лезть в прошивку и править её нет - всё легко решается кодом на python.
     
  13. nikolz

    nikolz Гуру

    Сообщения:
    4.156
    Симпатии:
    431
    вы что-то путаетесь в терминологии.
    код на питоне превращается компилятором и линкером в кусок прошивки.
     
  14. apatrushev

    apatrushev Новичок

    Сообщения:
    3
    Симпатии:
    0
    Я не буду с вами спорить. Не очень, значит не очень. ;)
     
  15. __ab__

    __ab__ Новичок

    Сообщения:
    21
    Симпатии:
    2
    Как то неожиданно, что IT "гуру" может не знать, что такое интерпретатор...
    Python как раз яркий представитель интерпретаторов - транслирует программу в p-код, который и интерпретирует..

    Прошивка в данном случае это и есть интерпретатор. Текстовый файл .py транслируется в байткод и выполняется
    Собственно вот C-код micropython, где видно как оно работает (выполняется байт-код)..
    При желании, там же, рядом, не сложно найти как оно транслируется...

    Больше читайте ;)
     
  16. nikolz

    nikolz Гуру

    Сообщения:
    4.156
    Симпатии:
    431
    ну да хамство вас не украшает.
    не хотел читать ликбез.
    но придется
    питон как и луа и джава имеют VM
    VM это не интерпретатор
    интерпретатор работает со строкой вашей программы на конкретном языке и разбирает строку в реальном времени
    VM машина работает с кодами ее собственных команд, как и любой железный процессор.
    --------------
    Но в ESP и OC и библиотеки и программа юзера помещаются во флеш в виде прошивки.
    Поэтому даже если вы напишите что-то для интерпретатора, то и интерпретатор и ваш текст станут частью прошивки.
     
  17. nikolz

    nikolz Гуру

    Сообщения:
    4.156
    Симпатии:
    431
    и еще понятие "прошивка" - это сленг.
     
  18. __ab__

    __ab__ Новичок

    Сообщения:
    21
    Симпатии:
    2
    Оно никого не украшет, и Вас тоже ;)
    Вы уж простите, если что, но видно что вы не очень знаете питон, то как он устроен и работает, но при этом пытаетесь что-то советовать.
    Зачем? Сбивать с толку новичков, которых тут полно и самоутверждаться на них?
    Судя по количеству симпатий в профиле, Вы многое знаете, но знать всё - невозможно. В этом нет ничего страшного :)

    Про луа не скажу - не близок он мне и не ковырялся я в нем. Ни как профи, ни для хобби.
    А что до Java и Python, есть разные реализации, которые немного по разному работают (особенно для Python)
    В классическом варианте оба эти инструмента транслируют строки кода в байт-код, который потом интерпретируется (ссылку на интерпретирующий код код я давал). В случае Java - транслятор это javac и машина это java. В случае питона все происходит внутри одной программы, причем эта программа умеет еще и на лету транслировать строки в байт код и передавать интерпретатору байт-кода (repl).
    Для того чтобы работать быстрее, питон умеет создавать претранслированные файлы байт-кода (но это не код процессора, в отличие от объектнгого кода, который генерит компилятор!)
    Кроме того, python (с первых версий) изначально отличался тем, что его интерпретатор легко встроит в код для C компилятора (изначально), а так же в сам питон легко встраивать библиотеки, написанные на С, при этом такие библиотеки выглядят, как написанные на питоне (пример: psycopg2)
    Пишу "изначально", потому подойдет любой код, который сможет слинковать Python (ASM, pascal...)
    Но не надо путать C библиотеки с библиотеками которые написаны на питоне.
    Первые встроены в firmware (раз не нравится "прошивка"), вторые генерируются динамически.
     
    fps нравится это.

Поделиться этой страницей