优化嵌入式Python解释器的大小

18

我花了最近的3个小时试图找出是否可以禁用或在不使用交互模式的情况下构建Python,或者如何使Linux上的python可执行文件更小。

你可以猜到它是为嵌入式设备而设计的,在交叉编译后,Python大约有1MB大小,对我来说太多了。

现在的问题:

有没有可能缩小Python可执行文件?也许是禁用交互模式(在命令行上启动Python程序)。

我查找了配置选项并尝试了其中一些,但对我的可执行文件没有产生任何变化。

我使用gcc的优化选项进行编译,已经进行了剥离。


请参考此SO问题,以在16MB RAM中运行。 - mmmmmm
我已经阅读了它,但问题在于自2008年以来Tinypy没有更新!对于Tinypy来说,不可能使用所有库或者使用起来不容易!每个库都需要太多的工作量。Python拥有小于500kb的体积是一个不可能实现的目标。 - Benny
1
许多年前,我在一家使用嵌入式硬件的公司工作,在尝试了许多不同的解释器之后,我们决定使用一个嵌入式 Forth 解释器。令人难以置信的是,可执行文件比本机二进制文件更小。 - Dour High Arch
是的,tinypy是Python的部分重新实现,而不是真正的嵌入式Python。我看到有人发布了一个即插即用的嵌入式Python系统的广告,只使用了8MB的NVRAM,留下3MB用于脚本和数据,超过1MB用于RAM,但这意味着它仍然接近4MB... - abarnert
你的目标平台是什么?(提供更多细节越好,至少需要CPU信息。) - abarnert
1
我使用OpenWRT环境,目标平台运行的是ARM CPU。 - Benny
3个回答

6
如果你真的想缩小Python,可以看一下这些项目:

http://code.google.com/p/python-on-a-chip/

如网站所述:

Python-on-a-Chip(p14p)是一个项目,旨在开发一种缩小版的Python虚拟机(代号为PyMite),该虚拟机可以在没有操作系统的微控制器上运行Python语言的大部分子集。 p14p的其他部分是设备驱动程序,高级库和其他工具。请加入python-on-a-chip谷歌组以讨论此项目。

这可能比预期的低级一些,但它确实被缩小了:

PyMite VM的特点:

  • 需要大约55 KB程序内存
  • 在4KB RAM中初始化;打印“hello world”需要5KB;建议最小RAM为8KB。
  • 支持整数,浮点数,元组,列表,字典,函数,模块,类,生成器,装饰器和闭包
  • 支持Python 2.6的29个关键字中的25个和112个字节码中的89个

您可以从此项目中获得有趣的想法。

请注意,您只能获得虚拟机,即可以运行pyc文件而不是py文件。(pyc文件跨平台,且比py文件小得多)

事实上,如果你真正针对最小的Python进行目标设置,你需要禁用部分库,甚至可能是编译器本身。
这个网站也许有一些有趣的指针:http://www.awaretek.com/pymo.html

非常有趣。它看起来像是一个类似Python的干净语言,而不是CPython的hack(标记-清除GC,无栈,没有C扩展等)。我认为我曾建议过从头开始做这个项目对OP来说可能太费力了,但在PyMite上构建可能是一个完全合理的项目。这可能取决于OP需要多少stdlib功能。 - abarnert

3

也许你可以通过配置来压缩一些内容,但是效果不会很明显。

实际的交互模式代码也非常简单,所以我怀疑你在这方面也不会节省太多空间。

我相信有更多实质性的功能你没有使用,可以从解释器中削减它们以减小文件大小。例如,你可能可以放弃大量的解析器和编译器,并只处理字节码。问题在于,唯一的方法是修改解释器源代码。(而且它并不是世界上最美丽的代码,所以你需要花费很多时间学习如何操作。)你还需要知道哪些功能可以削减。

另一个真正的选择就是编写一个类似Python的语言的小型解释器——例如,通过使用tinypy项目。但是根据你的评论,除非非常接近,“类似Python”的语言似乎不够好。

嗯,我想还有一个选择:修改一个不同的、更好的Python实现,而不是CPython。问题在于Jython和IronPython都不是本地代码(虽然也许你可以使用JVM->本地编译器,或者将足够的Jython压缩到J2ME JVM中?),而PyPy在嵌入式系统上真的还没有准备好。(你能等几年吗?)因此,你可能只能使用CPython。


3
以上观点我赞同。让Python适应1Mb已经是很大的成就了。如果嵌入式设备的空间非常紧张,我会考虑更小的替代方案,比如Lua(据称只需要不到500kb的空间)。 - Alexandre Vinçon
谢谢你们的快速帮助,当然还有纠正我的英语!我认为我们现在可以把Python放在这个大小上,也许在未来硬件中建立它时会有更多的闪存空间。感谢大家。 - Benny
1
PyPy很可能永远无法在这样受限制的环境中使用。增加的抽象显然会增加大小,嵌入可执行文件中的JIT编译器也没有帮助。 - fijal

1
我在2018年末偶然发现了这个问题。此时,最流行的小型Python - 特别是为受限平台和嵌入式设备设计的Python - 是MicroPython,它广泛用于微控制器等领域。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接