mirror of
https://github.com/espressif/esptool.git
synced 2025-10-19 20:13:00 +08:00
feat: Remove .py suffix from scripts
BREAKING CHANGE: - The .py suffix is deprecated for the following scripts: - esptool - espefuse - espsecure - esp_rfc2217_server
This commit is contained in:
@@ -5,6 +5,46 @@
|
|||||||
|
|
||||||
This document describes the breaking changes made to esptool.py, espsecure.py and espefuse.py in the major release ``v5``. It provides guidance on adapting existing workflows and scripts to ensure compatibility when updating from ``v4.*``.
|
This document describes the breaking changes made to esptool.py, espsecure.py and espefuse.py in the major release ``v5``. It provides guidance on adapting existing workflows and scripts to ensure compatibility when updating from ``v4.*``.
|
||||||
|
|
||||||
|
|
||||||
|
Command-Line Tool Invocation Changes
|
||||||
|
************************************
|
||||||
|
|
||||||
|
The preferred way to invoke esptool command-line tools has changed. Instead of running the scripts with `.py` suffix, you should now use the console scripts without the `.py` suffix.
|
||||||
|
|
||||||
|
**Affected Tools:**
|
||||||
|
|
||||||
|
- ``esptool.py`` → ``esptool``
|
||||||
|
- ``espefuse.py`` → ``espefuse``
|
||||||
|
- ``espsecure.py`` → ``espsecure``
|
||||||
|
- ``esp_rfc2217_server.py`` → ``esp_rfc2217_server``
|
||||||
|
|
||||||
|
**Migration Steps:**
|
||||||
|
|
||||||
|
1. Update your command-line invocations to use the new names without `.py`:
|
||||||
|
|
||||||
|
**Before:**
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
esptool.py chip_id
|
||||||
|
espefuse.py summary
|
||||||
|
espsecure.py sign_data --keyfile key.pem data.bin
|
||||||
|
|
||||||
|
**After:**
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
esptool chip_id
|
||||||
|
espefuse summary
|
||||||
|
espsecure sign-data --keyfile key.pem data.bin
|
||||||
|
|
||||||
|
2. Update scripts to use the new command names.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Scripts with ``.py`` suffix are still available for backward compatibility, but they will produce deprecation warning and will be removed in the next major release.
|
||||||
|
|
||||||
|
|
||||||
esptool.py ``v5`` Migration Guide
|
esptool.py ``v5`` Migration Guide
|
||||||
*********************************
|
*********************************
|
||||||
|
|
||||||
|
@@ -21,6 +21,7 @@ from espefuse.efuse_interface import (
|
|||||||
SUPPORTED_READ_COMMANDS,
|
SUPPORTED_READ_COMMANDS,
|
||||||
SUPPORTED_CHIPS,
|
SUPPORTED_CHIPS,
|
||||||
)
|
)
|
||||||
|
from esptool.util import check_deprecated_py_suffix
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"get_esp",
|
"get_esp",
|
||||||
@@ -38,7 +39,7 @@ __all__ = [
|
|||||||
chain=True, # allow using multiple commands in a single run
|
chain=True, # allow using multiple commands in a single run
|
||||||
no_args_is_help=True,
|
no_args_is_help=True,
|
||||||
context_settings=dict(help_option_names=["-h", "--help"], max_content_width=120),
|
context_settings=dict(help_option_names=["-h", "--help"], max_content_width=120),
|
||||||
help=f"espefuse.py v{esptool.__version__} - ESP32xx eFuse get/set tool",
|
help=f"espefuse v{esptool.__version__} - ESP32xx eFuse get/set tool",
|
||||||
)
|
)
|
||||||
@click.option(
|
@click.option(
|
||||||
"--chip",
|
"--chip",
|
||||||
@@ -113,7 +114,7 @@ def cli(
|
|||||||
postpone,
|
postpone,
|
||||||
extend_efuse_table,
|
extend_efuse_table,
|
||||||
):
|
):
|
||||||
print(f"espefuse.py v{esptool.__version__}")
|
print(f"espefuse v{esptool.__version__}")
|
||||||
|
|
||||||
ctx.ensure_object(dict)
|
ctx.ensure_object(dict)
|
||||||
esp = ctx.obj.get("esp", None)
|
esp = ctx.obj.get("esp", None)
|
||||||
@@ -215,6 +216,7 @@ def main(argv: list[str] | None = None, esp: esptool.ESPLoader | None = None):
|
|||||||
|
|
||||||
|
|
||||||
def _main():
|
def _main():
|
||||||
|
check_deprecated_py_suffix(__name__)
|
||||||
try:
|
try:
|
||||||
main()
|
main()
|
||||||
except esptool.FatalError as e:
|
except esptool.FatalError as e:
|
||||||
|
@@ -20,7 +20,7 @@ from espefuse.efuse_interface import (
|
|||||||
|
|
||||||
click.rich_click.USE_CLICK_SHORT_HELP = True
|
click.rich_click.USE_CLICK_SHORT_HELP = True
|
||||||
click.rich_click.COMMAND_GROUPS = {
|
click.rich_click.COMMAND_GROUPS = {
|
||||||
"espefuse.py": [
|
"*": [
|
||||||
{
|
{
|
||||||
"name": "Burn commands",
|
"name": "Burn commands",
|
||||||
"commands": SUPPORTED_BURN_COMMANDS,
|
"commands": SUPPORTED_BURN_COMMANDS,
|
||||||
|
@@ -24,6 +24,7 @@ from cryptography.utils import int_to_bytes
|
|||||||
from esptool.logger import log
|
from esptool.logger import log
|
||||||
|
|
||||||
import esptool
|
import esptool
|
||||||
|
from esptool.util import check_deprecated_py_suffix
|
||||||
|
|
||||||
SIG_BLOCK_MAGIC = 0xE7
|
SIG_BLOCK_MAGIC = 0xE7
|
||||||
|
|
||||||
@@ -1579,11 +1580,11 @@ class Group(esptool.cli_util.Group):
|
|||||||
cls=Group,
|
cls=Group,
|
||||||
no_args_is_help=True,
|
no_args_is_help=True,
|
||||||
context_settings=dict(help_option_names=["-h", "--help"], max_content_width=120),
|
context_settings=dict(help_option_names=["-h", "--help"], max_content_width=120),
|
||||||
help=f"espsecure.py v{esptool.__version__} - ESP32 Secure Boot & Flash Encryption "
|
help=f"espsecure v{esptool.__version__} - ESP32 Secure Boot & Flash Encryption "
|
||||||
"tool",
|
"tool",
|
||||||
)
|
)
|
||||||
def cli():
|
def cli():
|
||||||
log.print(f"espsecure.py v{esptool.__version__}")
|
log.print(f"espsecure v{esptool.__version__}")
|
||||||
|
|
||||||
|
|
||||||
@cli.command("digest-secure-bootloader")
|
@cli.command("digest-secure-bootloader")
|
||||||
@@ -1960,6 +1961,7 @@ def main(argv: list[str] | None = None):
|
|||||||
|
|
||||||
|
|
||||||
def _main():
|
def _main():
|
||||||
|
check_deprecated_py_suffix(__name__)
|
||||||
try:
|
try:
|
||||||
main()
|
main()
|
||||||
except esptool.FatalError as e:
|
except esptool.FatalError as e:
|
||||||
|
@@ -82,6 +82,7 @@ from esptool.targets import CHIP_DEFS, CHIP_LIST, ESP32ROM
|
|||||||
from esptool.util import (
|
from esptool.util import (
|
||||||
FatalError,
|
FatalError,
|
||||||
NotImplementedInROMError,
|
NotImplementedInROMError,
|
||||||
|
check_deprecated_py_suffix,
|
||||||
flash_size_bytes,
|
flash_size_bytes,
|
||||||
)
|
)
|
||||||
from itertools import chain, cycle, repeat
|
from itertools import chain, cycle, repeat
|
||||||
@@ -112,7 +113,7 @@ click.rich_click.STYLE_COMMANDS_TABLE_COLUMN_WIDTH_RATIO = (1, 3)
|
|||||||
# Option group definitions, used for grouping options in the help output
|
# Option group definitions, used for grouping options in the help output
|
||||||
# Similar to 'add_argument_group' from argparse
|
# Similar to 'add_argument_group' from argparse
|
||||||
click.rich_click.OPTION_GROUPS = {
|
click.rich_click.OPTION_GROUPS = {
|
||||||
"esptool.py merge-bin": [
|
"* merge-bin": [
|
||||||
{
|
{
|
||||||
"name": "UF2 options",
|
"name": "UF2 options",
|
||||||
"options": [
|
"options": [
|
||||||
@@ -141,7 +142,7 @@ click.rich_click.OPTION_GROUPS = {
|
|||||||
],
|
],
|
||||||
}
|
}
|
||||||
click.rich_click.COMMAND_GROUPS = {
|
click.rich_click.COMMAND_GROUPS = {
|
||||||
"esptool.py": [
|
"*": [
|
||||||
{
|
{
|
||||||
"name": "Basic commands",
|
"name": "Basic commands",
|
||||||
"commands": [
|
"commands": [
|
||||||
@@ -297,7 +298,7 @@ def check_flash_size(esp: ESPLoader, address: int, size: int) -> None:
|
|||||||
cls=Group,
|
cls=Group,
|
||||||
no_args_is_help=True,
|
no_args_is_help=True,
|
||||||
context_settings=dict(help_option_names=["-h", "--help"], max_content_width=120),
|
context_settings=dict(help_option_names=["-h", "--help"], max_content_width=120),
|
||||||
help=f"esptool.py v{__version__} - serial utility for flashing, provisioning, "
|
help=f"esptool v{__version__} - serial utility for flashing, provisioning, "
|
||||||
"and interacting with Espressif SoCs.",
|
"and interacting with Espressif SoCs.",
|
||||||
)
|
)
|
||||||
@click.option(
|
@click.option(
|
||||||
@@ -1172,6 +1173,7 @@ def get_default_connected_device(
|
|||||||
|
|
||||||
|
|
||||||
def _main():
|
def _main():
|
||||||
|
check_deprecated_py_suffix(__name__)
|
||||||
try:
|
try:
|
||||||
main()
|
main()
|
||||||
except FatalError as e:
|
except FatalError as e:
|
||||||
|
@@ -128,6 +128,19 @@ def get_key_from_value(dict, val):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def check_deprecated_py_suffix(module_name: str) -> None:
|
||||||
|
"""Check if called with deprecated .py suffix"""
|
||||||
|
import sys
|
||||||
|
from esptool import log
|
||||||
|
|
||||||
|
script_name = sys.argv[0] if sys.argv else ""
|
||||||
|
if script_name.endswith(module_name + ".py"):
|
||||||
|
log.warning(
|
||||||
|
f"DEPRECATED: '{module_name}.py' is deprecated. Please use '{module_name}' "
|
||||||
|
"instead. The '.py' suffix will be removed in a future major release."
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class PrintOnce:
|
class PrintOnce:
|
||||||
"""
|
"""
|
||||||
Class for printing messages just once. Can be useful when running in a loop
|
Class for printing messages just once. Can be useful when running in a loop
|
||||||
|
15
setup.py
15
setup.py
@@ -2,12 +2,25 @@ import os
|
|||||||
from setuptools import setup
|
from setuptools import setup
|
||||||
|
|
||||||
if os.name != "nt":
|
if os.name != "nt":
|
||||||
|
# For backward compatibility with py suffix
|
||||||
scripts = ["esptool.py", "espefuse.py", "espsecure.py", "esp_rfc2217_server.py"]
|
scripts = ["esptool.py", "espefuse.py", "espsecure.py", "esp_rfc2217_server.py"]
|
||||||
entry_points = {}
|
entry_points = {
|
||||||
|
"console_scripts": [
|
||||||
|
"esptool=esptool.__init__:_main",
|
||||||
|
"espsecure=espsecure.__init__:_main",
|
||||||
|
"espefuse=espefuse.__init__:_main",
|
||||||
|
"esp_rfc2217_server=esp_rfc2217_server.__init__:main",
|
||||||
|
],
|
||||||
|
}
|
||||||
else:
|
else:
|
||||||
scripts = []
|
scripts = []
|
||||||
entry_points = {
|
entry_points = {
|
||||||
"console_scripts": [
|
"console_scripts": [
|
||||||
|
"esptool=esptool.__init__:_main",
|
||||||
|
"espsecure=espsecure.__init__:_main",
|
||||||
|
"espefuse=espefuse.__init__:_main",
|
||||||
|
"esp_rfc2217_server=esp_rfc2217_server.__init__:main",
|
||||||
|
# For backward compatibility with py suffix
|
||||||
"esptool.py=esptool.__init__:_main",
|
"esptool.py=esptool.__init__:_main",
|
||||||
"espsecure.py=espsecure.__init__:_main",
|
"espsecure.py=espsecure.__init__:_main",
|
||||||
"espefuse.py=espefuse.__init__:_main",
|
"espefuse.py=espefuse.__init__:_main",
|
||||||
|
@@ -83,7 +83,7 @@ class ESPRFC2217Server(object):
|
|||||||
self.port = rfc2217_port or self.get_free_port()
|
self.port = rfc2217_port or self.get_free_port()
|
||||||
self.cmd = [
|
self.cmd = [
|
||||||
sys.executable,
|
sys.executable,
|
||||||
os.path.join(TEST_DIR, "..", "esp_rfc2217_server.py"),
|
os.path.join(TEST_DIR, "..", "esp_rfc2217_server"),
|
||||||
"-p",
|
"-p",
|
||||||
str(self.port),
|
str(self.port),
|
||||||
arg_port,
|
arg_port,
|
||||||
@@ -1815,3 +1815,30 @@ class TestESPObjectOperations(EsptoolTestCase):
|
|||||||
assert "Checksum: 0x83 (valid)" in output
|
assert "Checksum: 0x83 (valid)" in output
|
||||||
assert "Wrote 0x2400 bytes to file 'output.bin'" in output
|
assert "Wrote 0x2400 bytes to file 'output.bin'" in output
|
||||||
assert esptool.__version__ in output
|
assert esptool.__version__ in output
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.host_test
|
||||||
|
class TestOldScripts:
|
||||||
|
def test_esptool_py(self):
|
||||||
|
output = subprocess.check_output(["esptool.py", "-h"])
|
||||||
|
decoded = output.decode("utf-8")
|
||||||
|
assert "esptool.py" in decoded
|
||||||
|
assert "DEPRECATED" in decoded
|
||||||
|
|
||||||
|
def test_espefuse_py(self):
|
||||||
|
output = subprocess.check_output(["espefuse.py", "-h"])
|
||||||
|
decoded = output.decode("utf-8")
|
||||||
|
assert "espefuse.py" in decoded
|
||||||
|
assert "DEPRECATED" in decoded
|
||||||
|
|
||||||
|
def test_espsecure_py(self):
|
||||||
|
output = subprocess.check_output(["espsecure.py", "-h"])
|
||||||
|
decoded = output.decode("utf-8")
|
||||||
|
assert "espsecure.py" in decoded
|
||||||
|
assert "DEPRECATED" in decoded
|
||||||
|
|
||||||
|
def test_esp_rfc2217_server_py(self):
|
||||||
|
output = subprocess.check_output(["esp_rfc2217_server.py", "-h"])
|
||||||
|
decoded = output.decode("utf-8")
|
||||||
|
assert "esp_rfc2217_server.py" in decoded
|
||||||
|
assert "DEPRECATED" in decoded
|
||||||
|
Reference in New Issue
Block a user