更新2022-02-21
回到这里后,原来的解决方案不再有效。乐高改变了项目的目录结构。每次上传都会创建:
- 一个随机数目录
projects
- a
__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它有效。我不喜欢这个解决方案,因为你只是写出文件,这使得编辑变得有点糟糕,但至少这很好。
Why mindstorms.custom
?这似乎是放置您自己的自定义功能的好地方,它不太可能被官方 Mindstorms 发行版覆盖,并将所有代码集中在一个地方。你could从根目录创建您自己的目录并将文件放在那里,但为了易于使用,我们就这样做。
和以前一样,保留下面的旧答案。
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'
-
使用以下内容创建一个新的 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()
以上应该有效。请注意,如果您需要update文件,您必须调整模块代码以删除原始文件(如果存在),但这是一个微小的更改。除了上述之外我没有做过任何事情,但是这个could导致一种将丢失的 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
, 但是你can在函数中使用类型提示。我也非常不喜欢你不能从控制台复制粘贴。