同时支持Tcl和Python

Supporting both Tcl and Python?

本文关键字:Python Tcl 支持      更新时间:2023-10-16

我有一个二进制应用程序,它与Tcl静态链接,前端是Tcl解释器。我想为用户提供使用Python执行相同命令的功能,作为关键字选项。Tcl语法的一个示例是:

set_foo -foo 1.0 -bar 3.0 -cat x

因此python的等价物可能看起来像这样:

set_foo(foo=1.0, bar=3.0, cat="x")

两次构建程序更好吗?一次作为Tcl应用程序,一次作为Python应用程序?或者只是将所有内容都保持为Tcl,并在其解释器中有一个调用Python脚本的命令?

这些命令的实现方式是,它们对所使用的脚本语言一无所知。api是:

void set_fooCmd(Handler &data);

而Handler是一个C++类,它处理解析选项并将它们提供给命令实现。到目前为止,处理程序是为Tcl实现的,但不是为Python实现的。

所有直接与Tcl接口的代码都在它自己的目录中,并从程序的其余部分抽象出调用。

更新:这不是一个重复的问题:为科学代码选择前端/解释器

因为他们正在询问是从Tcl转移到Python还是Matlab。我已经知道我想同时支持Tcl和Python,我非常想知道人们使用了什么方法。例如:

  1. 从Tcl调用Python解释器
  2. 为Python前端和Tcl前端编译单独的应用程序
  3. 其他一些方法

您可能想看看类似SWIG的东西,它将允许您创建一个具有straitforward C接口的应用程序(以任何您喜欢的方式实现),并将该接口公开给各种其他脚本语言。SWIG支持Tcl和Python,以及Ruby、PHP、Scheme、Perl和许多其他语言。

从Tcl 调用Python解释器

不需要开销。

然而,Python的tkinter模块从Python调用Tcl。有一个先例,但引入太多的接口层似乎很复杂。

为Python前端和Tcl前端编译单独的应用程序。

这很常见。许多项目都有多个绑定——Python、Tcl、Perl等。

有一种可能的方法可以稍微简化语言绑定。

  1. 修复二进制应用程序以处理简单的文本输入和输出。您将从stdin读取并向stdout写入。

  2. 编写Python(和Tcl)应用程序,收集参数,将二进制文件作为子流程进行分叉;并将参数写入二进制文件的stdid,并从二进制文件的标准输出中读取结果。

Tcl是完全可嵌入的(只要你记得在Tcl_CreateInterp之前调用Tcl_FindExecutable),所以你可以这样做,只需使用少量Python代码来准备在同一进程中执行的Tcl脚本。这将是快速可靠的(多进程的东西需要上下文切换来进行通信,并且有更多的故障模式),并最大限度地减少所需的额外代码量。

Python唯一的问题是Tcl解释器(即Tcl_CreateInterp返回的句柄)与当前线程强绑定;您无法从其他线程安全地调用它们(因为为了减少全局锁的数量,在实现内部使用了大量特定于线程的数据)。虽然我们可以讨论这些差异,但总的来说,这只是一种不同的做事方式;只有当你把事情联系在一起时,你才真正需要关心。如果你的Python代码实际上是单线程的,你可以跳过复杂性,直接访问最简单的东西;在某种程度上是不安全的,但在另一个层面上是安全的。