python - 如何从新 Lego Mindstorms Robot Inventor 上的自定义 Python 模块导入

标签 python lego mindstorms

我一直在使用新的 LEGO® MINDSTORMS® Robot Inventor。
创建新的“项目”时,所述项目似乎包含一个文件。但是,在每个示例代码文件的开头,可以看到 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
有谁知道我如何创建自己的模块并将它们导入给定的项目?是否可以?

最佳答案

2022-02-21 更新
回到这个问题后,原来的解决方案不再有效。 Lego 更改了项目的目录结构。每次上传都会创建:

  • projects 的随机数目录
  • 一个 __init__.mpy文件是您发送的代码的编译版本

  • 以上意味着我们不能再从上传的代码中读取来运行。我们可以做的是在文件系统的其他地方创建文件以使我们的代码持久化。
    例如,这个 MVP 将实现您所需要的:
  • 上传以下内容:
    content = """
    __version__ = "0.1.1-20220221"
    
    def hello() -> None:
        print("hello from {}".format(__version__))
    """
    
    f = open("mindstorms/custom.py", "w")
    f.write(content)
    f.close()
    
  • 使用以下内容创建第二个项目:
    from mindstorms.custom import hello
    
    hello()
    

  • 以前的解决方案很脆弱,我不确定破坏它的更改何时真正发生。我已经在 上进行了测试集线器操作系统 3.1.43 它有效。我不喜欢这种解决方案,因为您只是在写出文件,这会使编辑变得更糟,但至少这很好。
    为什么mindstorms.custom ?这似乎是放置您自己的自定义功能的好地方,它不太可能被官方 Mindstorms 发行版覆盖,并将所有代码集中在一个地方。您可以从根目录创建自己的目录并将文件放在那里,但为了便于使用,我们就这样做吧。
    和以前一样,保留下面的旧答案。

    编辑:在这上面花了更多时间,并弄清楚了!我在下面保留原始答案。这是一个简短的可重复解决方案。测试使用(取自 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'
    
  • 使用以下内容创建一个新的 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 在运行时不使用该约定。
  • 将该项目发送到您的 Hub 并运行它。请注意,您的集线器上会保留这些文件,我不知道您是否需要担心内存限制。
  • 使用以下内容创建一个新的 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 ,但您可以在函数中使用类型提示。我也非常不喜欢你不能从控制台复制粘贴。

    关于python - 如何从新 Lego Mindstorms Robot Inventor 上的自定义 Python 模块导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64449448/

    相关文章:

    python - 用 Pandas 中的另一个值替换某些列中的所有负值

    python - Pandas 多索引中带有大写字母标签的错误

    programming-languages - Lego Mindstorms编程-您使用/推荐哪种语言/IDE?

    tensorflow - 使用 tensorflow 识别乐高积木?

    robotics - Mindstorm NXT编程循环退出条件

    python - Django Admin通用内容类型多模型内联表单

    python - 避免 python scrapy 中的响应重叠

    image - 挑战 : Take a 48x48 image, 找到导致创建该图像的最便宜的乐高解决方案的连续区域!

    multithreading - 使用 NXT 进行多线程