我有一个与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 ++类,它处理解析选项并将它们提供给命令实现。到目前为止,Handler是为Tcl实现的,而不是Python。
所有与Tcl直接连接的代码都在自己的目录中,并从程序的其余部分抽象出来。
更新: 这不是一个重复的问题: Picking a front-end/interpreter for a scientific code
因为他们在询问是否要从Tcl转移到Python或Matlab。我已经知道我想支持Tcl和Python,我非常想知道人们使用了什么方法。如:
答案 0 :(得分:1)
您可能希望查看类似SWIG的内容,这将允许您创建具有固定C接口的应用程序(以您喜欢的方式实现),并将该接口公开给各种其他脚本语言。 SWIG支持Tcl和Python,以及Ruby,PHP,Scheme,Perl,and many others.
答案 1 :(得分:0)
从Tcl调用Python解释器
不必要的开销。
然而,Python的tkinter
模块从Python调用Tcl。有一个先例,但引入太多的界面层似乎很复杂。
为Python前端和Tcl前端编译单独的应用程序。
这很常见。许多项目都有多个绑定--Python,Tcl,Perl等。
有一种可能的方法可以略微简化语言绑定。
修复二进制应用程序以使用简单的文本输入和输出。您将从stdin读取并写入stdout。
编写收集参数的Python(和Tcl)应用程序,将二进制分解为子进程;并将参数写入二进制文件的stdid并从二进制文件的标准输出中读取结果。
答案 2 :(得分:0)
Tcl是完全可嵌入的(只要你记得在Tcl_FindExecutable
之前调用Tcl_CreateInterp
)所以你可以这样做,使用少量的Python代码来准备你执行的Tcl脚本同样的过程。这将是快速和可靠的(多进程的东西需要上下文切换进行通信,并具有更多的故障模式)并最大限度地减少所需的额外代码量。
来自Python的唯一问题是Tcl解释器(即Tcl_CreateInterp
返回的句柄)非常强烈绑定到当前线程;你无法从其他线程安全地调用它们(因为在实现中使用了特定于线程的数据以减少全局锁的数量)。虽然我们可以讨论这些差异,但它通常只是一种不同的做事方式;只有当你真正需要关心这些东西时,才会这样。
如果您的Python代码实际上是单线程的,那么您可以跳过复杂性并直接访问最简单的直接访问;在一个层面不安全,但在另一个层面安全。