DEV Community

codemee
codemee

Posted on

3 2

ESP32 Arduino Core 在 Monterey 12.3 編譯錯誤

如果你是使用 Mac 電腦, 在作業系統升級到 macOS 12.3(Monterey) 或更新的版本後, 會發現要使用 Arduino IDE 編譯 ESP32 的程式會出現以下的錯誤:

這是因為 ESP32 Arduino Core 在連結程式的階段會使用到一個 gen_esp32part.py 的 python 程式檔, 但是 macOS 在升級到 12.3 時把內建的 Python 2.7 拿掉了, 所以你會在 Arduino 的訊息窗內看到要執行 python 時找不到這個指令。

解法一:安裝 Python 2.7

你可能會想說既然 Python 2.7 被拿掉了, 那我就把 Python 2.7 裝回來就好了。

單純安裝 Python 2.7 無法解決問題

不過事情沒有這麼簡單, 由於你自己手動安裝的 Python 2.7 的執行檔 python 並不是放在 macOS 舊版本內建 Python 的 /usr/bin/ 下, 而是在以下的路徑:

% where python
/Library/Frameworks/Python.framework/Versions/2.7/bin/python
/usr/local/bin/python
% ls -l /usr/local/bin/python
lrwxr-xr-x  1 root  wheel  68  4 23 09:11 /usr/local/bin/python -> ../../../Library/Frameworks/Python.framework/Versions/2.7/bin/python
Enter fullscreen mode Exit fullscreen mode

由於放置的路徑並不在 macOS 系統預設的 PATH (/bin, /usr/bin) 中, 因此當 Arduino 要執行 python 時仍然會找不到。

不過因為上述 Python 路徑會被加到 zsh 的 .zprofile 中:

% cat .zprofile

# Setting PATH for Python 2.7
# The original version is saved in .zprofile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
export PATH
Enter fullscreen mode Exit fullscreen mode

所以在終端機中鍵入 python 是可以執行的:

% python
Python 2.7.18 (v2.7.18:8d21aa21f2, Apr 19 2020, 20:48:48)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
Enter fullscreen mode Exit fullscreen mode

如果在終端機中使用 open 開啟 Arduino, 就可以正常編譯了:

% open Arduino.app
Enter fullscreen mode Exit fullscreen mode

修改 ESP32 套件檔案強制執行特定路徑的 Python

如果可以修改 ESP32 套件的設定, 讓它執行上述路徑下的 python, 就可以解決問題了。以下以 ESP32 Arduino Core 2.0.2 版為例, 要修改的檔案在:

~/Library/Arduino15/packages/esp32/hardware/esp32/2.0.2/platform.txt

只要將其中出現 python 的地方修改為 /usr/local/bin/python, 像是這樣:

name=ESP32 Arduino
version=
...

tools.esptool_py.network_cmd=/usr/local/bin/python "{runtime.platform.path}/tools/espota.py" -r
tools.esptool_py.network_cmd.windows="{runtime.platform.path}/tools/espota.exe" -r

tools.gen_esp32part.cmd=/usr/local/bin/python "{runtime.platform.path}/tools/gen_esp32part.py"
...
Enter fullscreen mode Exit fullscreen mode

重新執行 Arduino 後就可以正常編譯程式了。

解法二:改用內建的 Python 3

前面的解法雖然可行, 不過 macOS 之所以要拿掉 Python 2, 就是因為 Python 官方已經不再支援 Python 2, 而我們故意把 Python 2 裝回來, 好像背道而馳。好消息是, ESP32 套件使用的 python 程式相容於 Python 3, 而且 macOS 其實有支援 Python 3。

安裝內建的 Python 3

/usr/bin/ 下有 python3 指令, 不過如果你執行它, 會看到它噴出以下的訊息 (如果你執行後看到 Python 3, 表示你之前已經安裝過):

% /usr/bin/python3
xcode-select: note: no developer tools were found at '/Applications/Xcode.app', requesting install. Choose an option in the dialog to download the command line developer tools.
Enter fullscreen mode Exit fullscreen mode

告訴你需要安裝命令列開發者工具, 同時也會看到如下的視窗:

它會安裝相關的命令列工具, 其中就包含有 Python 3.8, 安裝完後 /usr/bin/python3 就會執行 Python 3。

要注意的是這個 Python 3 的環境並不會隨官方版本即時更新, 如果你很在意, 建議可以改成安裝 Python 官方提供的版本。

修改 ESP32 套件強制使用內建的 Python 3

由於內建的 Python 3 的指令是在 /usr/bin/, 包含在系統預設的路徑下, 所以只要修改:

~/Library/Arduino15/packages/esp32/hardware/esp32/2.0.2/platform.txt

檔案, 將其中出現 python 的地方修改為 python3, 像是這樣:

name=ESP32 Arduino
version=
...

tools.esptool_py.network_cmd=python3 "{runtime.platform.path}/tools/espota.py" -r
tools.esptool_py.network_cmd.windows="{runtime.platform.path}/tools/espota.exe" -r

tools.gen_esp32part.cmd=python3 "{runtime.platform.path}/tools/gen_esp32part.py"
...
Enter fullscreen mode Exit fullscreen mode

不需要指明完整的路徑, 存檔後重新執行 Arduino 就可以正常編譯程式了。

官方作法

目前 ESP32 Arduino Core 開發中版本 2.0.3.RC1 採取的就是這一種解法, 如果你不想自行修改 platform.txt 檔案, 也可以透過以下網址安裝開發中版本的 ESP32 套件:

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json
Enter fullscreen mode Exit fullscreen mode

解法三:使用 Python 官方的 Python 3

前面有提過, 內建的 Python 3 不會即時隨官方版本更新, 這若是很重要, 就可以改裝 Python 官方的 Python 3

安裝 Python 官方的 Python 3

這種方式和內建的 Python 3 最重要的差別就是 python3 的指令是放在 /usr/local/bin/ 下, 因此, 稍後修改 ESP32 套件設定檔時要指明完整的路徑。

如果想移除前一種解法安裝的命令列開發者工具, 只要將以下資料夾刪除即可:

/Library/Developer/CommandLineTools
Enter fullscreen mode Exit fullscreen mode

修改 ESP32 套件強制使用 Python 官方的 Python 3

由於 python3 的指令是放在 /usr/local/bin/ 下, 因此要修改

~/Library/Arduino15/packages/esp32/hardware/esp32/2.0.2/platform.txt

檔案, 將其中出現 python 的地方修改為 /usr/local/bin/python3, 像是這樣:

name=ESP32 Arduino
version=
...

tools.esptool_py.network_cmd=/usr/local/bin/python3 "{runtime.platform.path}/tools/espota.py" -r
tools.esptool_py.network_cmd.windows="{runtime.platform.path}/tools/espota.exe" -r

tools.gen_esp32part.cmd=/usr/local/bin/python3 "{runtime.platform.path}/tools/gen_esp32part.py"
...
Enter fullscreen mode Exit fullscreen mode

存檔後重新執行 Arduino 就可以正常編譯了。

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

Top comments (0)

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more