Как импортировать из пользовательских модулей Python в новый робот Lego Mindstorms Inventor

Я использую новый робот-изобретатель LEGO® MINDSTORMS®.

При создании нового проекта указанный проект, кажется, содержит один файл. Однако в начале каждого примера файла кода видно, что модули mindstorm импортированы, например:

from mindstorms import MSHub, Motor, MotorPair, ColorSensor, DistanceSensor, App
from mindstorms.control import wait_for_seconds, wait_until, Timer
from mindstorms.operator import greater_than, greater_than_or_equal_to, less_than, less_than_or_equal_to, equal_to, not_equal_to
import math

Кто-нибудь знает, как я могу создавать свои собственные модули и импортировать их в данный проект? Является ли это возможным?


person Pedro Pinheiro    schedule 20.10.2020    source источник


Ответы (1)


EDIT: потратил еще немного времени на это и понял! Я сохраняю исходный ответ ниже. Вот краткое воспроизводимое решение. Протестировано в работе с (взято с os.uname)

sysname='LEGO Technic Large Hub'
nodename='LEGO Learning System Hub'
release='1.11.0'
version='v1.11-1139-gf7407e5a0 on 2020-06-19'
machine='LEGO Technic Large Hub with STM32F413xx'
  1. Создайте новый проект Python с таким содержимым:

    import os
    import sys
    
    def example() -> None:
        print("imported")
    
    # EOF
    
    # upload the module to the Hub
    print("beginning upload from {}...".format(__name__))
    os.chdir("projects")
    open("__init__.py", "w").close()
    filename = "{}.py".format(__name__.split("/")[-1])
    new_filename = "mystorms.py"
    try:
        os.remove(new_filename)
    except:
        print("{} does not exists".format(new_filename))
    os.rename(filename, new_filename)
    # remove everything after EOF
    with open(new_filename, "r") as f:
        content = f.read()
    content = content.split("# EOF")[0]
    with open(new_filename, "w") as f:
        f.write(content)
    print(os.listdir())
    
    sys.exit()
    

    Материал после # EOF выполняет фактическую загрузку и гарантирует, что при попытке импортировать это в другое место вы не загрузите его повторно. Обратите внимание, что в обычном Python вы бы обернули это в if __name__ == "__main__", но Mindstorms не использует это соглашение во время работы.

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

  3. Создайте новый проект Python со следующим:

    import os
    
    import projects.mystorms as ms
    
    print(os.uname())
    ms.example()
    

Вышеуказанное должно работать. Обратите внимание: если вам нужно обновить файл, вам придется изменить код модуля, чтобы удалить оригинал, если он существует, но это незначительное изменение. Я не делал ничего, кроме вышеперечисленного, но это может привести к тому, что отсутствующие элементы stdlib будут добавлены и в Mindstorms.


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

import array
import builtins
import cmath
import ctypes
import errno
import gc
import hashlib
import heapq
import io
import json
import math
import os
import random
import re
import select
import struct
import sys
import time

Основная тема, по-видимому, ограничивает доступ к файловой системе и заставляет выполнять любые асинхронные операции с помощью реальных методов Mindstorms (например, hub.speaker.start_beep() и т.п.). Существует некоторая структура каталогов (файлы 0-19), но я не понял, можно ли ее использовать для достижения того, что вам нужно.

Также интересно отметить, что вы не можете import typing, но вы можете использовать подсказки типов в своих функциях. Мне также очень не нравится, что вы не можете скопировать-вставить из консоли.

person mmoran0032    schedule 23.10.2020
comment
После обновления Hub OS 2.1.4.13 я заметил, что вывод os.uname() не соответствует версии, отображаемой в настольном приложении. Я поднял проблему с Lego и попросил подробностей о том, как они делают обновления. - person mmoran0032; 02.01.2021
comment
Лучший способ получить информацию о версии: from version import __version__; print(__version__) # 2.1.4-mindstorms.13 - person mmoran0032; 02.01.2021