【问题标题】:Optimizing the size of embedded Python interpreter优化嵌入式 Python 解释器的大小
【发布时间】:2012-09-19 20:10:51
【问题描述】:

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

您可以猜到它是针对嵌入式设备的,在交叉编译之后,Python 大约有 1MB 大,这对我来说太大了。

现在的问题:

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

我查找了配置选项并尝试了其中一些,但它不会对我的可执行文件产生任何更改。

我用 gcc 的优化选项编译它,它已经被剥离了。

【问题讨论】:

  • 查看此SO question 以在 16MB RAM 中运行
  • 我已经阅读了它,但问题是 tinypy 自 2008 年以来就没有更新!而对于 tinypy 来说,不可能使用所有的库或者不容易使用!每个图书馆的工作量太大。 python的大小小于500kb是不可能的目标
  • 许多年前,我在一家使用嵌入式硬件的公司工作,在尝试了许多不同的解释器之后,我们决定使用嵌入式 Forth。可执行文件比本机二进制文件小,我不骗你。
  • 是的,tinypy 是 Python 的一部分的重新实现,而不是真正的嵌入式 Python。我见过有人制作即插即用嵌入式 Python 系统的广告,该系统仅使用 8MB NVRAM,剩下 3MB 用于脚本和数据,超过 1MB 用于 RAM,但这意味着它仍然接近 4MB……
  • 我使用的是 OpenWRT 环境,目标平台运行的是 ARM CPU

标签: python embedded


【解决方案1】:

我在 2018 年末偶然发现了这个问题。此时,最流行的微型蟒蛇——以及专为受限平台和嵌入式设备设计的微型蟒蛇——是 MicroPython,它在微控制器等应用中很受欢迎。

【讨论】:

    【解决方案2】:

    如果你真的想缩小python,你可以看看那些项目:

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

    正如网站上所说:

    Python-on-a-Chip (p14p) 是一个开发简化版的项目 运行重要的 Python 虚拟机(代号 PyMite) 没有操作系统的微控制器上的 Python 语言的子集。这 p14p 的其他部分是设备驱动程序、高级库和 其他工具。请加入python-on-a-chip google群讨论 这个项目。

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

    PyMite 虚拟机的特点:

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

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

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

    事实上,如果你真的以最小的python为目标,你需要禁用部分库,也可能是编译器本身。

    这个网站可能也有有趣的指针:http://www.awaretek.com/pymo.html

    【讨论】:

    • +1。很有意思。它看起来像是一种整洁的类似 Python 的语言,而不是 CPython 的 hack(标记扫描 GC、无堆栈、无 C 扩展等)。我认为我认为对于 OP 的项目来说,从头开始做太多的工作,但是在 PyMite 上构建可能是一个完全合理的项目。这可能取决于 OP 需要多少 stdlib 功能。
    【解决方案3】:

    也许你可以通过配置把它塞得更紧一点,但不多。

    另外,实际的交互模式代码非常简单,所以我怀疑你会在那里节省很多。

    我确信还有更多您没有使用的实质性功能,您可以从解释器中破解以减小大小。例如,您可能会丢弃一大块解析器和编译器,只处理字节码。问题是这样做的唯一方法是破解解释器源。 (而且它不是世界上最漂亮的代码,所以你将不得不花费大量时间来学习你的方法。)你必须知道你可以实际破解哪些功能。

    另一个真正的选择是为类似 Python 的语言编写一个更小的解释器——例如,通过选择 tinypy 项目。但是从您的 cmets 来看,除非非常接近,否则听起来“类 Python”对您来说是不够的。

    好吧,我想还有另一种选择:开发一种比 CPython 更好的 Python 实现。问题是 Jython 和 IronPython 不是本机代码(尽管也许您可以使用 JVM->本机编译器,或者可能将足够多的 Jython 塞进 J2ME JVM?),而且 PyPy 确实还没有准备好在嵌入式的黄金时间系统。 (你能等几年吗?)所以,你可能被 CPython 困住了。

    【讨论】:

    • +1 上面的语句。让 Python 适应 1Mb 已经是一项了不起的成就。如果嵌入式设备的空间太紧,我会考虑更小的替代品,比如 lua(声称可以容纳不到 500kb)
    • 感谢你们的快速帮助,当然还有更正我的英语!我认为我们现在让 Pyhton 达到这个大小,并且当我们有更多闪存空间时,也许会在我们未来的硬件中构建它。 THX 给大家
    • PyPy 很可能永远无法在如此狭窄的环境中使用。添加的抽象肯定会增加大小,而嵌入在可执行文件中的 JIT 编译器也无济于事。
    猜你喜欢
    • 2016-08-15
    • 1970-01-01
    • 2011-12-06
    • 2016-01-08
    • 2014-10-12
    • 2023-04-05
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    相关资源
    最近更新 更多