
Circuit Python旨在降低编程和电子学的入门门槛,这使它非常适合初学者。它也非常可扩展,适用于更复杂的项目,这意味着对于有更多经验的人来说也非常适用。如果你已经有一段时间的编程经验,或者准备探索与Circuit Python一起使用的更高级选项,那么本节非常适合你!
你的开发板上的Circuit Python代码会在检测到文件更改或写入时自动重新启动你的代码。这使得编程非常快速,因为你保存后它会重新运行。
但是,在拔掉或重置开发板之前,你必须等待文件保存完成!在Windows上使用某些编辑器,这有时可能需要长达90秒,在Linux上可能需要30秒,因为文本编辑器未完全保存文件。Mac OS似乎没有这种延迟。
这是非常重要的,请注意。如果在计算机完成将文件写入开发板之前拔掉或重置开发板,可能会损坏驱动器。如果发生这种情况,你可能会丢失已编写的代码,因此定期将代码备份到计算机非常重要。
为了避免文件系统损坏的可能性,请使用在保存时完全写出文件的编辑器。请查看下面推荐的编辑器列表。
- mu是一个安全写入所有更改的编辑器(也是我们推荐的编辑器)
- emacs也是一个编辑器,在保存文件时会完全写入
- Sublime Text能安全写入所有的更改
- Visual Studio Code似乎能安全写入所有的更改
- 在Linux上,gedit似乎能安全写入所有的更改
- Python 3.8.1或更高版本中的IDLE已修复,会立即写入所有更改
- Thonny在保存时会完全写出文件
只推荐在特定设置或附加组件下使用
- vim/vi能安全写入所有的更改。但要设置vim不要no swapfile(.swp文件:记录编辑的临时文件)到CIRCUITPY。使用vim -n运行vim,设置不写入交换文件选项,或设置directory选项以将交换文件写入其他位置。否则,交换文件的写入会触发程序重新启动。
- 如果在设置->系统设置->同步(默认为true)中打开了“安全写入”,PyCharm IDE是安全的。
- 如果你使用Atom,请安装fsync-on-save包或language-circuitpython包,以确保它始终将所有更改写入CIRCUITPY中的文件。
- SlickEdit仅在添加宏以刷新磁盘的情况下才有效。
不推荐使用以下编辑器!
- notepad(默认的Windows编辑器)和Notepad++可能写入速度较慢,因此建议使用上述推荐的编辑器!如果使用notepad,请确保将驱动器弹出。
- Python 3.8.0或更早版本中的IDLE不会立即强制执行更改。
- Linux上的nano不会强制执行更改。
- Linux上的geany不会强制执行更改。
- 其他编辑器未经测试,因此请使用推荐的编辑器!
前面已经介绍了Circuit Python库的基本使用方法。将库复制到CIRCUITPY驱动器上,它就可以在你的代码中使用了。
但是,你可能已经注意到有两个可供下载的捆绑包,或者在某些板上,不必复制库即可使用它。这是怎么回事?本页将详细介绍库文件的更深层次的细节,如何使用它们,为什么选择其中一个而不是另一个,以及更多相关的内容。
库文件有两种不同的文件格式:.mpy和.py。每种文件类型都有单独的库捆绑包。Circuit Python可以以三种不同的方式访问库:.mpy文件、.py文件或冻结模块。接下来的几节详细介绍了这些文件类型之间的区别,以及访问库的不同方式。
文中所指的“内存”指的是RAM(随机存取内存),它是微控制器中的读/写内存。RAM和内存在本文中是一个意思。
有一个部分涉及到文件系统空间。文件系统空间不是RAM;它是存储文件的地方。
最常用的库文件类型是.mpy文件。你可以直接从其GitHub存储库下载库的.mpy版本,但获取它们的最简单、最方便的方式是从circuitpython.org上的“Libraries”页面(https://circuitpython.org/libraries)下载适当的捆绑包。库页面上的第一个捆绑包是.mpy捆绑包。该捆绑包提供了Adafruit Circuit Python捆绑包中的所有库,都以.mpy格式提供。

“Community Bundle”由社区提供和维护的库组成,也以.mpy格式提供,位于Libraries页面的下方。

.mpy文件是通过在.py文件上运行mpy-cross工具生成的文件,该工具将.py文件编译为字节码。这个过程会删除文档字符串并进行一些小的优化。此外,注释、空格和类型提示不会转化为字节码,因此在编译后也不会存在。编译的结果是一个体积较小,占用的RAM内存较少的文件。mpy-cross使得一些库可以作为.mpy文件提供给Circuit Python,否则它们无法作为.py文件导入到较小的板上,因为它们占用的RAM太多,无法在板上编译。
基本上,你可以为Circuit Python提供一个.mpy文件,它会加载到RAM中,但由于它已经编译,所以不需要即时编译。考虑到这一点以及.mpy格式带来的小型优化,它使用的内存比.py文件少。但需要注意的是,.mpy文件是不可读的。如果你想直接查看代码,你需要使用.py文件。
要使用.mpy格式的库,你只需将.mpy库文件复制到CIRCUITPY驱动器上的/lib文件夹中。例如,如果你正在使用需要NeoPixel库的演示程序,你将把neopixel.mpy文件复制到/lib文件夹中。
如果你想要修改库,你会发现你无法编辑.mpy文件。为此,你需要切换到.py文件。
使用mpy-cross,你可以将自己的.py文件快速简单地转换为.mpy文件。
(https://adafruit-circuit-python.s3.amazonaws.com/index.html?prefix=bin/mpy-cross/)
从这里下载你操作系统的最新mpy-cross,确保选择与你的Circuit Python版本匹配的mpy-cross版本。可以在Windows、macOS、x64 Linux和树莓派Linux上找到编译版本。例如,如果你使用的是Circuit Python 7.3.0和MacOS Big Sur,你可以下载mpy-cross-macos-bigsur-7.3.0-arm64。为了方便使用,将下载的文件重命名为mpy-cross。
要创建.mpy文件,你首先需要一个.py文件。打开终端程序或命令行,cd进入包含mpy-cross的目录,并运行以下命令:
./mpy-cross path/to/your-library-file.py
这将在与原始.py文件相同的目录中创建your-library-file.mpy文件。
然后,将your-library-file.mpy文件复制到CIRCUITPY驱动器上以使用它。就这么简单!
每个Circuit Python库都可以作为.py文件使用。你可以从各自的GitHub存储库中单独下载.py库文件。更快、更方便的方法是从circuitpython.org上的“Libraries”页面下载捆绑包,然后使用库的.py文件。

捆绑包中的第二个文件是.py文件捆绑包。它包含了Adafruit Circuit Python捆绑包中的所有库的.py版本。
.py文件是一个你可以在你最喜欢的Python编辑器中打开并修改的Python文件。然而,除非你计划修改一个库并测试你的修改,一般来说最好还是使用.mpy文件。基本上,.py文件需要更多的内存,在较小的微控制器上,比如SAMD21(M0),尝试在你的代码中导入库时可能会导致内存分配失败。
冻结库是将库文件的内容嵌入到Circuit Python固件中的特殊类型的库。这意味着,当你在使用这种库时,不需要在CIRCUITPY驱动器上复制或加载任何库文件。它们已经包含在Circuit Python固件中。
一些微控制器板,比如Circuit Playground Express,没有足够的内存来运行某些库文件中的代码,即使它们是.mpy格式。在这些情况下,适用的库以及可能的依赖项会被包含在特定板上的Circuit Python构建中。冻结库是指在各种板上的Circuit Python构建中包含的任何库。这样做有两个优点:如果存在内存问题,它也能确保代码的运行,但更实际的是,这意味着你可以在你的代码中访问这些库,而无需将文件复制到CIRCUITPY/lib目录中。
有一个绝佳的例子:Circuit Playground Express。CPX最容易使用Adafruit Circuit Playground库。Adafruit Learn System中的许多指南都使用Circuit Playground库。问题是,如果你复制Circuit Playground库以及其依赖项(Adafruit Circuit Python HID、LIS3DH、Thermistor和NeoPixel)到CPX上,你的代码会因可用内存不足而很快运行失败。Circuit Playground库导入所有的依赖项,所以当你在你的代码中导入它时,你也导入了列表中的其他部分。那么,你可以怎么做呢,那就是将所有这些库都冻结到CPX的Circuit Python固件中!
如果你想知道你的微控制器板的Circuit Python构建中是否包含冻结库,你可以在circuitpython.org的Downloads页面上查看你特定板的信息。搜索你的板,并单击它以打开其特定的下载页面。在当前适用于你的板的每个Circuit Python版本下,你会找到一个"内置模块可用:"的列表,以及(如果你的构建包含冻结库的话)一个"包含的冻结模块:"的列表。冻结模块列表包括所有冻结到你的板的Circuit Python中的库。下面显示了circuitpython.org上的PyPortal页面,包括其冻结模块列表,位于下图右下角的洋红色突出显示的部分。

Project Bundle的基础知识在Circuit Python Libraries页面上有介绍。然而,了解Project Bundle与冻结库一起使用时的工作原理非常重要。Project Bundle不知道冻结库的存在。因此,单击"下载Project Bundle"按钮会下载一个zip文件,其中包含了一个示例所需的所有库文件,无论这些库是否被冻结到特定板构建中。这不会导致运行库时出现问题(继续阅读本页面以获取详细信息),但这意味着库占用了文件系统空间。如果这对你造成问题,你可以从CIRCUITPY/lib目录中删除任何被冻结到你的板的Circuit Python构建中的库文件。
这里有一个使用Circuit Playground Express的示例。下面是来自Piano in the Key of Lime指南(https://learn.adafruit.com/circuit-playground-express-piano-in-the-key-of-lime/piano-in-the-key-of-lime)中的/bundle_lib目录和Circuit Python for CPX上的冻结模块列表。(https://circuitpython.org/board/circuitplayground_express/)

注意,adafruit_bus_device是一个特例。它作为一个真正的模块内置到大多数板的Circuit Python中(你可以在"内置模块可用:"列表中看到)。Project Bundle也不知道它,因此它也包含在下载中。只要你在Downloads页面上看到它,你也可以从你的微控制器上删除它。
正如你所看到的,所有的"包含的冻结模块:"也都包含在从Project Bundle下载的/lib目录中。因此,如果你开始在Circuit Playground Express上的文件系统空间不足,你可以从CIRCUITPY/目录中删除与Downloads页面上的列表匹配的文件,以释放更多空间。这适用于任何包含冻结库的微控制器的项目包。
Circuit Python在微控制器上寻找特定的库文件类型,以特定的顺序在特定的位置。当你尝试使用更新或修改过的库时,你可以利用这一点。
如果你想测试你对一个以.mpy文件或冻结到Circuit Python中的库文件所做的修改或更新,有几种方法可以做到这一点。要测试你的更新,你可以将更新的.py库文件复制到CIRCUITPY驱动器的适当位置。特定于冻结库,你可以创建一个包含更改的Circuit Python固件。
库文件的开发需要在微控制器上实时测试库的更改,以确保它们正常工作。这意味着要更新.py文件,将其复制到CIRCUITPY,并运行使用你的更新的示例。然而,一旦你进入开发环节,你可能会在不同格式的库文件上拥有多个副本。你如何确定Circuit Python是否运行了更新的文件?——>检查格式。
Circuit Python将首先尝试运行一个.py文件。这意味着如果你有一个.py库文件和同一个库的.mpy文件在同一个目录中,Circuit Python将运行.py文件。
例如,如果你在CIRCUITPY的/lib文件夹中有neopixel.py和neopixel.mpy,那么neopixel.py文件将优先于neopixel.mpy文件。因此,在你的code.py文件中导入neopixel来测试你的更新时,它将导入你的更新库。如果你在CIRCUITPY驱动器的根目录中有相同的.py和.mpy文件,结果将是相同的。
你可以利用这一点,但这也可能导致潜在问题。下面的"常见问题和解决方法"部分有更多详细信息。(https://learn.adafruit.com/welcome-to-circuitpython/library-file-types#common-issues-and-solutions-3118124-33)
CIRCUITPY上各种库文件的位置也影响Circuit Python在选择文件时的工作方式。在下一节中了解具体情况。
测试你的库修改在微控制器上非常重要。冻结库对此可能造成一些困难,因为你不能从板上删除它们。因此,Circuit Python以特定的顺序在不同的位置查找库文件,以允许你"覆盖"其他位置的库文件。你知道这个顺序是什么吗?这就是sys.path的作用。
在Circuit Python(和Python)中,sys.path是sys模块中的一个变量,返回一个字符串列表,指定模块或库文件的搜索路径。更简单地说,它允许你告诉Circuit Python确切地在哪里以及以什么顺序查找CIRCUITPY驱动器上的库文件。
要了解具体情况,你可以在code.py中运行以下两行代码,或在你当前使用的板的REPL中运行它们。如果特定板的Circuit Python构建中包含冻结模块,结果将如下所示:
//******************分割线******************//
>>> import sys
>>> print(sys.path)
['', '/', '.frozen', '/lib']
//******************分割线******************//
如果特定板的Circuit Python构建中没有冻结模块,结果将如下所示:
//******************分割线******************//
>>> import sys
>>> print(sys.path)
['', '/', '/lib']
//******************分割线******************//
这实际上意味着什么呢?你可以将结果分解如下。
如果特定板的Circuit Python固件中内置了冻结库,Circuit Python将按照以下顺序在以下位置查找库文件:
1. 当前目录(CIRCUITPY/)
2. 根目录(CIRCUITPY/)
3. 冻结库(.frozen在这个目的上是一个虚假的目录,因为冻结模块不在文件系统中)
4. 库文件夹(CIRCUITPY/lib)
如果特定板的Circuit Python构建中没有冻结库,Circuit Python将按照以下确切顺序在以下位置查找库文件:
1. 当前目录(CIRCUITPY/)
2. 根目录(CIRCUITPY/)
3. 库文件夹(CIRCUITPY/lib)
从实际角度来看,这意味着什么呢?以下是一些示例。
1. 如果你将一个库的.mpy版本放入/lib文件夹中,然后发现问题。然后你获取了该库文件的.py版本,进行了更改,并准备测试。你可以将修改后的.py文件复制到CIRCUITPY/的根目录中,这将“覆盖”.mpy文件,因为Circuit Python首先找到你的修改的.py文件并运行它。
2. 如果你正在使用一个冻结到Circuit Python中的特定库的微控制器板,并且你发现问题。你可以将修改后的.py文件放在CIRCUITPY/的根目录中,这将“覆盖”冻结模块,因为Circuit Python首先找到你的修改的.py文件并运行它。
你还可以在修改的.py文件上运行mpy-cross,并将.mpy文件放在CIRCUITPY/的根目录中,这将“覆盖”冻结模块和lib/文件夹中的所有文件。如果你发现使用.py文件导致代码由于内存问题而运行失败,这是必需的。
从本质上讲,这也意味着你可以将库文件放在CIRCUITPY/驱动器的根目录上,它们将像在/lib文件夹中一样运行。然而,如果你总是将库文件复制到/lib文件夹中,那么在测试之前,这种测试技巧始终可用,而无需在测试之前删除文件。
对于一些板,例如Circuit Playground Express,你会发现使用冻结模块覆盖将导致代码运行失败,因为内存分配失败。在某些情况下,即使在.py文件上运行了mpy-cross,你的代码仍然会失败。这意味着你可能需要创建一个包含你的修改库的Circuit Python版本。
测试冻结库的更困难但更现实的方法是构建Circuit Python固件,并在其中包含你的修改库。这是最现实的测试方法,因为它确保更改仍适用于特定的Circuit Python构建。它还允许你在即使作为.mpy文件的情况下,由于内存限制而无法运行的情况下测试库。但是,对于某些人来说,这是一个令人生畏的前景,当他们想测试他们对库的简单更改时。
这就是为什么有关创建你自己的Circuit Python版本有详细说明(https://learn.adafruit.com/building-circuitpython/introduction)的原因。按照说明进行操作,直到"构建Circuit Python"部分(https://learn.adafruit.com/building-circuitpython/build-circuitpython#build-circuitpython-2986723-14)。在运行实际构建之前,你将需要在Circuit Python存储库的本地副本中创建一个新的分支,然后将修改后的库复制到frozen/目录中。(https://learn.adafruit.com/contribute-to-circuitpython-with-git-and-github/always-work-on-a-branch)
在这之前,你需要按照此处的步骤复制要修改的库的副本到你的计算机上。在本地库目录内进行修改。当你准备测试时,你将整个库目录,例如Adafruit_CircuitPython_CircuitPlayground/目录,复制到Circuit Python存储库的本地副本的根目录中的frozen/目录中。这将替换现有版本并使用你的更新版本。

一旦在frozen/目录中用你的修改版本的库目录更新了,你就可以开始构建了。继续按照"构建Circuit Python"指南中的说明完成Circuit Python的构建。请记住,如果与示例中的板不同,要更改你要构建的板。构建完成后,将固件.uf2文件复制到*BOOT驱动器中。

这个构建是为Circuit Playground Express准备的。
现在,你可以测试你的更改了!
你现在了解了Circuit Python库以不同方式使用、访问和测试修改的方式。但是,你如何知道这些不同的选项实际上在内存使用方面有什么差异呢?有一种通过数字来查看实际差异的简单方法。
导入Python文件有两部分会使用额外的内存。代码编译过程以及在编译过程中和之后需要在内存中存储的生成的字节码。请记住,.mpy文件已经编译过了,不需要在导入时进行编译。
本质上,导入.mpy会加载已编译的代码,而导入.py必须在导入时编译代码。在这两种情况下,已编译的代码都存储在RAM中,生成的编译代码基本上大小相同。但是,编译过程在编译期间需要额外的RAM,如果可用的RAM不足,这个过程将会失败。编译也可能导致一些碎片,但在Circuit Python中大多数情况下都可以避免这种情况。
可以这样来看待。你可以将一个已经做好的蛋糕带到朋友家,也可以带上在朋友家烘烤相同蛋糕的材料。完成的蛋糕将占用相同数量的空间。但是,在做蛋糕之前,为了将成分组合在一起、烘烤它并撒上糖霜,你将需要更多的空间和资源。如果事实证明你的朋友没有足够的空间,或者缺少重要的成分,你将无法完成蛋糕。基本上,如果你不确定朋友家是否有足够的空间和资源来烘烤蛋糕,最好带上一个已经做好的蛋糕,以确保有蛋糕可供享用!
如果你不确定你的微控制器板是否具有运行.py库版本所需的内存资源,最简单的解决方法是选择.mpy文件。
Circuit Python具有内置的gc(garbage collector)模块,其中包括gc.mem_free()。其中mem_free()功能专门适用于Circuit Python(和Micro Python),因此在CPython的gc模块中不可用。
当你在REPL中运行gc.mem_free()或在code.py中运行print(gc.mem_free())时,它会返回可用的RAM的字节数。这是剩余的RAM量,用于导入更多库和执行代码。对于我们的目的来说,它将告诉我们导入.mpy文件、.py文件和冻结模块时使用了多少内存。
为了进行这个示例,你将使用Circuit Playground Express上的NeoPixel库。NeoPixel库被冻结到CPX的Circuit Python固件中,并且可以在两个包中找到:neopixel.mpy和neopixel.py。为了准备进行测试,你需要连接到串行控制台并进入REPL。
对于这些示例中的每一个,你首先要从REPL中运行以下命令:
//******************分割线******************//
>>> import gc
>>> gc.mem_free()
//******************分割线******************//
这将为你提供在导入任何其他库之前的可用内存基准。
首先,你将测试导入NeoPixel库的冻结版本时使用了多少内存。确保CIRCUITPY驱动器上没有复制到任何地方的库文件,包括/lib中!
一旦你确定了基准,如上面所述,运行以下命令:
//******************分割线******************//
>>> import neopixel
>>> gc.mem_free()
//******************分割线******************//

正如你所看到的,基准可用内存为17840字节。一旦导入冻结版本的NeoPixel库,你的可用内存就会减少到16432字节。导入冻结版本需要占用1408字节内存。
现在,你将测试导入NeoPixel库的未冻结.py版本时使用了多少内存。在CIRCUITPY的根目录中将neopixel.py文件复制到CIRCUITPY中。确保在此之前删除/neopixel.mpy文件,否则CircuitPython将首先运行冻结版本。
按照上述步骤进行相同的操作,获取基线并显示导入后的可用内存。

基准相同,但导入后的可用内存现在为13984字节。导入neopixel.mpy需要3856字节。
接下来,从CIRCUITPY驱动器中删除neopixel.mpy文件。将neopixel.py文件复制到CIRCUITPY/驱动器的根目录。
按照上述步骤进行相同的操作,获取基准并显示导入后的可用内存。

基准相同,但导入后的可用内存现在为11680字节。导入neopixel.py需要6160字节。
通过查看基准和导入后的内存使用情况,你可以确定使用.mpy或.py版本的库文件时需要多少内存。在大多数情况下,使用.mpy版本可以帮助你节省内存,因为它在导入时使用的内存较少,从而为你的应用程序留出更多的空间。
本页已经讲解了获取、访问和测试Circuit Python库修改的不同方法。以下是你在操作过程中可能遇到的一些问题以及处理建议。
你需要确定你下载了库的.mpy版本,并且以前使用.mpy文件运行代码,但现在由于内存使用而失败。最常见的原因是在同一目录中留下了相同库的.py版本(例如,.py和.mpy都在/lib中),或者.py文件位于“覆盖”目录中(例如.py位于/中,.mpy位于/lib中)。在这两个示例中,Circuit Python都将加载.py文件。
如果遇到此问题,请查看CIRCUITPY驱动器的内容,并确保在/或/lib中没有剩余的.py文件。往往情况下,删除.py文件将解决此问题。
如果你对内存错误的含义以及如何避免感兴趣,可以在本指南的常见问题解答中找到答案。归根结底,问题在于你的微控制器板上的内存不足以导入库或执行代码。(https://learn.adafruit.com/welcome-to-circuitpython/frequently-asked-questions#faq-3105286)
Circuit Playground Express是一款内存受限的微控制器板。在字节检查示例中,将Circuit Playground库替换为NeoPixel库会导致冻结模块和.mpy文件的行为相似。但是,如果你尝试将Circuit Playground库导入为.py包,它将无法导入,并显示类似下面的错误。

Circuit Playground库是一个很好的例子,因为该库非常大,导入了大量的依赖项,绝对不能作为.py文件在CPX上运行。这不适用于所有嵌入到Circuit Python各种版本中的库(如NeoPixel所示),因此在尝试测试修改或更新时,你不会始终得到此结果。
内存分配失败并不一定意味着你完全没有内存。Circuit Python内存会随着操作的增加而变得碎片化,整个内存上会有较小的内存块可用,这些内存块加起来足够使用,但没有足够大的块可用于分配给特定任务所需的内存。碎片化可能阻止分配需要连续内存块的任何内存块,例如大型缓冲区。在导入库文件的上下文中,它具体指的是没有足够大的内存块来分配所请求的内存。
在导入.mpy文件的情况下,编译的字节码跨越多个块进行导入。在导入.py文件的情况下,编译所需的内存可能超过了可用块的大小,在这种情况下,在导入任何字节码之前,内存都可能会耗尽。
Circuit Python确实会进行一些优化以避免内存碎片化。一旦成功导入库,它将被移动到可用内存的末尾,从而减少了碎片化。随着时间的推移,一些碎片化是无法避免的,但导入优化确实有助于减少初始碎片化。
如果你的代码在导入时失败,你可能会发现更改导入顺序可以使代码运行。在导入任何内容之前,会有较大的内存块可用。因此,在仍然有较大内存块可用的情况下,首先导入较大的库可能会使你的代码成功运行,即使最初失败了。这不是一个保证的结果,但在某些情况下可能有所帮助。
请记住,库文件有两种结构 - 单个文件和包含多个文件的目录。这些结构必须保持完整,以便Circuit Python能够使用库。对于单个文件,将该独立文件复制到CIRCUITPY驱动器上。对于目录,将整个目录及其内容复制到CIRCUITPY驱动器上。
此外,库文件不能放在另一个目录中。例如,如果你在CIRCUITPY上创建了一个neopixel/目录,并在其中放置了neopixel.mpy,你的代码将失败。Circuit Python不会检查多余的目录以寻找库文件或包。
在上述任何情况下,当你尝试在代码中使用库时,你的代码将失败。当Circuit Python无法找到库文件中使用的模块时,它会抛出错误。错误通常会类似于以下内容。(此错误特定于尝试在一个neopixel/目录中的neopixel.mpy中的code.py中创建像素对象的尝试。)

在你的Circuit Python体验中,你将编写各种不同的演示。显然,你需要为文件命名其他名称,而不是code.py,以便在多个演示中进行工作,这样你知道文件是什么,并且Circuit Python知道你当前要运行哪个文件。但是,在这样做的过程中,有一个严重的注意事项,可能会导致各种问题并使故障排除变得困难。你必须避免将文件命名为与库文件相同的名称。
假设你编写了一个NeoPixel示例。然后,你准备好进行其他示例。因此,你将当前的code.py重命名为neopixel.py,并继续下一个演示。下次需要在代码中使用NeoPixel库时,你将发现你的代码将失败。这是因为它尝试导入先前重命名为neopixel.py的代码,当然不包含库内容。
避免这种情况的最佳方法是在文件名中保持创意性。例如,始终在名称中包含代码(即neopixel_code.py),或者更详细地进行命名,称其为neopixel_all_pixels_red.py。这是两个简单的建议。还有很多其他创意命名文件的方法。