有人在嵌入式项目中使用Python吗?

41

我的公司正在使用Python进行一个相对简单的嵌入式项目。有没有其他人在嵌入式平台上使用Python?总体来说,它对我们很有帮助,应用程序开发快速,调试也快速。我喜欢这种语言的总体“简洁性”。

我在日常工作中唯一真正的问题是,与普通编译器相比,缺少静态检查可能导致问题在运行时被抛出。例如,一个简单的意外将字符串和整数连接在一起并在print语句中输出,可能会导致整个应用程序崩溃。

17个回答

16

我们在使用嵌入式ARM处理器和16MB RAM(运行Linux)的嵌入式开发板中大量使用Python。

它的表现非常出色,而且可以快速编写自定义代码,这是Python的一个优点。

至于代码的可靠性,我们尽量实现100%的测试覆盖率。使用Python编写测试非常快捷,并为您提供信心。我们使用Twisted Trial来运行测试并报告覆盖率,但还有许多其他工具可用。

根据我的经验,使用Python + 测试比任何其他替代方案更加可靠且快速。

唯一不足的是,针对嵌入式开发,有时Python可能会比较慢,有时会使用大量内存(相对而言)。但这并没有给我们带来问题。如果出现问题,Python很容易进行速度和内存分析。

Pychecker是一个非常有用的工具,可以捕获相当多的常见错误。


10

顺便提一下,请看这篇博客文章:“Python类型推断”,其中讨论了类型推断和静态类型,包括指向Guido van Rossum博客文章的链接,描述了将可选的静态类型添加到Python。

我同意Bruce Eckel的看法,认为进行“强大测试”比依靠强制类型更好。我认为这同样适用于嵌入式开发。


9
个人而言,我曾经参与过一些运行在BusRadio设备中的软件开发。这是一个基于Twisted和Python构建的嵌入式项目的示例。该设备是一个嵌入式XScale处理器,运行着一个debian-derived发行版,因此它可能不符合某些“嵌入式”的定义,但它非常小:可以安装在校车的仪表板上。
在使用Python和大型库时,有一些有趣的问题 - 解释器在极慢的芯片上启动并加载整个Twisted代码可能需要相当长的时间,并且有些东西需要特殊情况下的优化。然而,在任何时候,Python的动态特性都不是问题。所涉及的软件肯定不是完美的,但至少在使用Twisted时,简单的编程错误不会“使整个应用程序崩溃”。跟踪日志将被记录,处理将继续进行。
因此,如果您处于足够自由的嵌入式环境中,可以首先使用Python,那么它与开发“常规”程序(游戏、桌面应用程序、Web应用程序)没有任何区别。您不需要静态类型,这里也不需要。

我想强调在这种情况下使用Twisted是多么的适当。 - jjmontes

8

Telit制造包含GSM/GPRS调制解调器模块的产品,其中包括一个嵌入式Python解释器

我自己没有尝试过,所以不知道Python解释器与PC实现相比有何区别,例如哪些模块被包含、RAM和ROM内存限制、执行速度等等。

然而,正如用户foresightyj在评论中指出的那样,它们似乎使用的是Python 1.5.x,这是一个真正古老的版本,因此我会对它们持怀疑态度。Python开发人员不会喜欢降级到这样一个古老的版本,没有许多现代Python功能。我会担心这个老版本存在安全问题。


这是一种不错的编码方式,但在尝试在该平台上进行更多操作时会出现一些性能问题。好的一面是该平台不昂贵,这非常重要。请参见我的问题:https://dev59.com/1FzUa4cB1Zd3GeqP57ic - INS
1
我使用了Telit的GM862-GPS模块。如果我没记错的话,Python的版本是1.5.2。然而,速度并不是很快。它不支持中断、信号或线程,因此你的程序必须具备超级循环功能。因此,它只适用于小型项目。正如OP所指出的那样,由于Python没有静态类型检查,它可能会因为一些拼写错误或错误的类型而崩溃。我的做法是将所有内容放在一个大的try except块中,并将异常打印到串口甚至TCP套接字中,以便我知道发生了什么。 - foresightyj

8

在我之前的雇主那里,我曾经想花些时间尝试构建嵌入式系统,使用的是tinypy,它是一个“64k代码中的Python极简实现”。(但我从未实践过,而且现在也没有时间了。)


7
我一直在使用老旧的PowerPC和16MB RAM基于微波通信设备工作。我已经成功将Python 2.6.1解释器移植到VxWorks上,以便从目标shell直接使用命令行解释器或执行上传到目标闪存的Python脚本。我们使用这些脚本来对目标进行自动测试或执行诊断程序。有关整个过程的详细信息,请参见以下链接:如何将Python移植到VxWorks

4

在日常工作中,我唯一真正的问题是静态检查与普通编译器之间的区别可能会导致在运行时出现问题,例如,在 print 语句中意外将字符串和整数拼接,可能会导致整个应用程序崩溃。

单元测试是你唯一防范这些问题的方法。


3

根据我的经验,Python在桌面环境中的使用要比嵌入式领域更为普遍。这是由两个原因造成的,与Python是解释性语言有关:

  • C/C++语言比Python具有更高的性能(这对于使用慢速微控制器的嵌入式系统来说非常重要)
  • C/C++语言具有更确定的响应时间(这对于控制实时嵌入式系统的某些事物非常重要)。

当然,随着嵌入式系统变得更快,上市时间变得更短,Python将在嵌入式领域得到更广泛的应用。


3
我的团队编写了一款由C++和Python组成的嵌入式软件。我们决定使用C++编写基本类和重度计算例程,而将逻辑部分写在Python中。使用Boost库作为粘合剂。使用Boost从未容易,但结果非常出色。快速且易于修改。使用Python来表示自定义需求,我们能够实时满足客户需求,使用注入技术更改代码。这真是令人兴奋的事情!(好吧,我是个极客;)
我们开始用Python进行原型设计,但突然意识到它明显太慢了。因此,我们决定将程序结构化为不同的计算层,以达到速度要求。 C ++是最好的解决方案。
为了同时使用Python和C ++,我们必须严格控制类型。

3

我曾在一家公司工作,该公司使用Python开发基于Atmel AVR32和运行嵌入式Linux的嵌入式产品。由于缺乏可用的硬件原型,固件最初是在PC上开发的,然后移植到交叉编译的Python解释器上运行的嵌入式硬件上。

在开发过程中,能够在设备上“实时”调试和修改源代码是一个很大的优势,节省了很多时间。但Python解释器的速度和内存使用情况是一个很大的缺点。

在第一版生产固件发布后,我们将关键代码部分移植到C / C ++上。移植工作相当简单,并且在速度关键代码上改进了数个数量级(正如您所期望的那样)。

顺便提一下,大部分设计和生产测试代码都是使用Python编写的,主要在PC上的测试环境中运行。


1
请问您是如何转换到C语言的呢?是用Ctypes还是Python扩展包装器? - foresightyj

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