/Micropython-EasyMpycrossApp

Primary LanguagePythonGNU General Public License v3.0GPL-3.0

Micropython-EasyMpycrossApp

Auto translate .py file in disk (select) and output .mpyfile to disk (output)

一个自动转换.py文件为.mpy文件的脚本

作用

本脚本是为了方便(或复杂)的操作mpy-cross来转换.py文件.

mpy-cross会将.py文件进行预编码,编码后的文件可以像普通文件一样导入.

预编码的格式有三种bytecode,nativeviper

bytecode:类似于pyc的字节码,兼容性最好的编码格式,不需要区分CPU架构,可直接替代.py文件

native:将.py文件转换为操作码,目前不支持riscv架构

viper:机器码,兼容性最差,需要进行代码修改,同样不支持riscv架构

简单上手

  1. 克隆代码到本地

    git clone https://github.com/coinight/Micropython-EasyMpycrossApp.git
    cd Micropython-EasyMpycrossApp
    # 安装依赖项
    python -m pip install requirements.txt
    # 运行
    python main.py

    如果无法使用git或没有python环境可以下载打包好的脚本程序,并运行

  2. 选择需要生成的.py文件,可以看到选择的文件在左半部分显示

  3. 编码选择bytecode,选择要保存到的文件夹,点击生成

  4. 将编译好的.mpy上传到开发板进行测试


加速代码

确认你的芯片架构及.mpy版本

import sys

try:
    sys_mpy = sys.implementation.mpy
except:
    sys_mpy = sys.implementation._mpy
arch = [None, 'x86', 'x64',
        'armv6', 'armv6m', 'armv7m', 'armv7em', 'armv7emsp', 'armv7emdp',
        'xtensa', 'xtensawin'][sys_mpy >> 10]
print('mpy version:', sys_mpy & 0xff)
print('mpy flags:', end='')
if arch:
    print(' -march=' + arch, end='')
if sys_mpy & 0x100:
    print(' -mcache-lookup-bc', end='')
if not sys_mpy & 0x200:
    print(' -mno-unicode', end='')

在开发板运行以上代码,可以知道你的芯片架构,如下

# rp 2040
>>> ...
mpy version: 6
mpy flags: -march=armv6m -mno-unicode

没有显示march则不支持nativeviper

脚本生成的.mpy文件仅支持v6版本mpy,请确认你的micropython版本符合下表的规定,如果需要生成早期版本的.mpy需要自行pip下载

MicroPython版本 .mpy版本
v1.19 及更高版本 6
v1.12 - v1.18 5
v1.11 4
v1.9.3-v1.10 3
v1.9-v1.92 2
v1.5.1-v1.8.7 1

native

native会将代码转换为CPU操作码,因此你需要选择架构(参见上一节)为符合的架构

native不兼容的代码

  1. 上下文With
  2. 生成器
  3. 调用装饰器时不会传入被装饰函数
  4. 自己发掘...

由此可见大部分代码可以直接编译为native而不需要或仅需要少量更改代码,因此建议使用native作为加速代码的主要方式

Viper

viper会将代码转换为机器码,因此你不仅需要选择架构而且需要更改大部分代码,

参见最大化Micropython速度 — Micropython 1.19.1 文档 (micropython.org)

本篇不再赘述

打包为可执行文件

如果你的电脑没有python环境,可以使用已打包好的可执行文件,打包方式如下:

  1. 拥有Python环境的电脑

  2. 运行

    # 安装基本依赖项
    python -m pip install -r requirements.txt
    # 安装打包工具
    python -m pip install pyinstaller
    # 打包
    python build.py
  3. 打开目录下的dist/目录,就可以看到打包好的应用