我一直在使用新的 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'
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 在运行时不使用该约定。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/