Pycopy-最低限度且节省内存的Python实现

2020-06-09 18:33:15

Pycopy的目标是开发和维护Python(兼容)语言的最低限度、轻量级和可扩展的实现。Pycopy to CPython类似于Schemeto Common Lisp。Pycopy在云、桌面系统和小型嵌入式系统上都能很好地工作,并且可以一直扩展到微控制器。该项目由Paul Sokolovsky开发和维护,最初基于由Damien George、Paul Sokolovsky和贡献者开发的MicroPython。名称";Pycopy&34;和";MicroPython&34;在项目文档和源代码中可以互换使用。

警告:此项目处于测试阶段,可能会更改代码库,包括项目范围的名称更改和API更改。

Pycopy实现了整个Python3.4语法(包括EXCEPTIONS、WITH、YILE FROM等,另外还有来自Python3.5的异步/等待关键字)。提供以下核心数据类型:str(包括基本Unicode支持)、bytes、bytearray、tuple、list、dict、set、frozenset、array.array、Collection tions.namedtuple、类和实例,内置模块包括sys、time、struct等,选择端口支持for_thread模块(多线程)。注意,对于数据类型和模块,只实现了Python3功能的一个子集。

Pycopy可以执行文本源代码形式的脚本,也可以从预编译字节码执行脚本,在这两种情况下,都可以从设备上的文件系统执行脚本,也可以将其冻结为可执行文件。

Pycopy是高度可移植的,主存储库包括对POSIX操作系统(Linux、MacOSX、FreeBSD等)、Windows、Android和许多裸机微控制器系统(见下文)的支持。可以很容易地实现到其他系统的移植。POSIX端口(昵称为Unix端口)是Pycopy的参考端口。

就像巨蟒一样,Pycopy也有它的禅宗。Pycopy的主要原则是简单、简约和轻便。

同时,Pycopy努力成为一种全栈语言,并与更广泛的Python生态系统兼容。Pycopy项目以一种广为人知的优雅方式解决了这些看似冲突的目标:它是一个多级项目,并提供了灵活的配置选项。具体地说,有一个用C编写的定义良好的轻量级核心,定义了原生Pycopy语言。在它之上,提供了许多选项,实现了额外的功能(通常会提供更多的CPython兼容性)。例如,在核心之上,提供了原生Pycopy内置模块,定义了原生Pycopy API,它提供了CPython模块功能的子集,同时还对其进行了一些扩展(由Pycopy的高效目标驱动)。这些原生Pycopy模块有明确的命名空间,允许实现与CPython API完全兼容的模块,而无需对主项目进行任何更改。

在这个主要项目之上,还有一些单独的项目来进一步扩展Pycopy功能并实现全栈生态系统。例如,有一个为Pycopy实现完全兼容的CPython标准库的sa pycopy-lib项目(见下文)。

最后,在该基础设施之上,有一个由第三方包组成的生态系统,这些包由Pycopy用户自己管理。

使用Pycopy的艺术在于了解某个特定功能的归属。就像CPython一样,它几乎从来不是核心项目,而且几乎总是第三方软件包的用户。

ports/STM32/-在PyBoard和类似的STM32板上运行的Pycopy版本(使用ST的Cube HAL驱动程序)。

端口/最小/-最小端口。如果您想要将项目移植到另一个微控制器,请从这个开始。

docs/--Sphinx reStrucureText格式的用户文档。呈现的HTML文档可以在http://pycopy.readthedocs.io/上找到。

";make";用于构建组件,或在基于bsd的系统上构建组件。您还需要bash、GCC和Python3.3+作为命令python3提供(如果您的系统只有Python2.7,则使用附加选项python=python2调用make)。

大多数端口都需要首先构建Pycopy交叉编译器。该程序名为mpy-Cross,用于将Python脚本预编译为.mpyfile,然后可以将其包含(冻结)到端口的固件/可执行文件中。要构建mpy交叉,请使用以下命令:

unix端口需要具有GCC和GNU make的标准unix环境。支持x86和x64架构(即x86 32位和64位),以及ARM和MIPS。要将功能齐全的端口移植到另一个架构,需要编写一些汇编代码来进行异常处理和垃圾回收,或者也可以使用基于setjmp/long jmp的后备实现。

$./pycopy>;>;>;列表(对于范围(10)中的x,对于[4,2,1]中的y,对于x,为5*x+y)。

使用CTRL-D(即EOF)退出shell。了解有关命令行选项的信息(特别是如何增加较大应用程序可能需要的堆大小):

按照上述说明构建的Pycopy可执行文件是本机Pycopy软件的生产可执行文件。还可以构建pycopdev可执行文件,该文件提供额外的反射、诊断和可扩展性功能,但代价是代码大小和内存使用效率。特别是,pycopy-dev与为CPython编写的软件更加兼容。要构建pycopy-devariant,运行make dev。

Unix端口需要libffi库和pkg-config工具。在Debian/Ubuntu/Mint派生Linux发行版上,安装build-Essential(包括工具链和make)、libffi-dev和pkg-config包。

其他依赖项可以与Pycopy一起构建。这可能是启用额外特性或功能所必需的,在最近的版本中,默认情况下可能会启用这些特性或功能。要构建这些附加依赖项,请首先获取它们的git子模块:

这将获取端口需要的所有相关的git子模块(子存储库)。使用相同的命令获取子模块的最新版本,因为它们会不时更新。在执行之后:

这将构建所有可用的依赖项(无论是否使用它们)。如果您打算使用额外的选项(如交叉编译)构建Pycopy,则应该传递相同的选项集来生成dedeib。要实际启用/禁用依赖项的使用,请编辑port/unix/mpconfigport.mk文件,该文件包含选项的内联说明。例如,要构建SSL模块(上述upip工具需要,因此在默认情况下处于启用状态),MICROPY_PY_USSL应设置为1。

对于某些端口,构建所需的依赖项是透明的,并且是自动进行的。但是它们仍然需要使用make submodule命令来获取。