问题描述
我想知道 mindstorms Robot Inventor 的 mindstorms
模块的源代码在哪里。
from mindstorms import ...
Etc..
这就是我想要的。
我尝试了多种 python 方法来归档文件路径,但它们都返回 ./projects/8472.py
谢谢, 希诺斯
解决方法
您可能一直在使用 __file__
和类似的东西,对吗?是的,这将为您提供当前正在运行的文件,但由于您无法编辑实际 Mindstorms 代码的代码,因此它没有帮助。相反,您希望检查目录本身,就像您的常规 Python 代码在其他地方访问数据文件一样。
大多数内部系统都是 .mpy
文件(请参阅 http://docs.micropython.org/en/v1.12/reference/mpyfiles.html),因此直接从设备读取代码不是最佳选择。此外,这意味着许多“标准库”包丢失或不完整;你不能import pathlib
,但你可以import os
,但你不能使用os.walk()
。这些限制使任何类型的目录遍历都更加令人沮丧,但并非不可能。
例如,文件 runtime/extensions.music.mpy
如下所示(注意:由于应用程序不允许,因此未复制粘贴):
M☐☐☐ ☐☐☐
☐6runtime/extensions/music.py ☐☐"AbstractExtensions*☐☐$abstract_extension☐☐☐☐YT2 ☐☐MusicExtension☐☐4☐☐☐Qc ☐|
☐☐ ☐ ☐☐ ☐☐☐☐ ☐2 ☐☐play_drum2☐☐☐play_noteQc ☐d:
☐☐ *☐☐_call_sync#☐,☐+/-☐☐drumb6☐YQc☐ ☐☐drum_nos☐musicExtension.playDrum☐☐E☐
☐ *☐ #☐,☐+/-☐☐instrumentb*☐☐noteb*☐☐durationb6☐YQc☐ ☐☐☐☐s☐musicExtension.playNote
当然,您可以有点看到发生了什么,但这并没有那么有用。
您需要在此处使用 os.listdir
和 print
的组合,因为 MicroPython 实现不授予对 os.walk
的访问权限。帮助您入门的示例代码:
import os
import sys
print(os.uname()) # note: doesn't reflect actual OS version,see https://stackoverflow.com/questions/64449448/how-to-import-from-custom-python-modules-on-new-lego-mindstorms-robot-inventor#comment115866177_64508469
print(os.listdir(".")) # ['util','projects','runtime',...]
print(os.listdir("runtime/extenstions")) # ['__init__.mpy','abstract_extension.mpy',...]
with open("runtime/extensions/music/mpy","r") as f:
for line in f:
print(line)
sys.exit()
同样,控制台缺少复制粘贴功能很粗糙,因此即使您确实进入了“在屏幕上显示文件的内容”部分,也没有那么有用。
需要注意的一件很酷的事情是,如果您加载了一个临时程序,您可以阅读常规 .py
中的代码。它与您预期的一样易于理解,因为它使用了非常 低级调用和抽象,而不是您通常编写的 hub.light_matrix.show_image("CLOCK6")
。