同时支持Tcl和Python
Supporting both Tcl and Python?
我有一个二进制应用程序,它与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,我非常想知道人们使用了什么方法。例如:
- 从Tcl调用Python解释器
- 为Python前端和Tcl前端编译单独的应用程序
- 其他一些方法
您可能想看看类似SWIG的东西,它将允许您创建一个具有straitforward C接口的应用程序(以任何您喜欢的方式实现),并将该接口公开给各种其他脚本语言。SWIG支持Tcl和Python,以及Ruby、PHP、Scheme、Perl和许多其他语言。
从Tcl 调用Python解释器
不需要开销。
然而,Python的tkinter
模块从Python调用Tcl。有一个先例,但引入太多的接口层似乎很复杂。
为Python前端和Tcl前端编译单独的应用程序。
这很常见。许多项目都有多个绑定——Python、Tcl、Perl等。
有一种可能的方法可以稍微简化语言绑定。
-
修复二进制应用程序以处理简单的文本输入和输出。您将从stdin读取并向stdout写入。
-
编写Python(和Tcl)应用程序,收集参数,将二进制文件作为子流程进行分叉;并将参数写入二进制文件的stdid,并从二进制文件的标准输出中读取结果。
Tcl是完全可嵌入的(只要你记得在Tcl_CreateInterp
之前调用Tcl_FindExecutable
),所以你可以这样做,只需使用少量Python代码来准备在同一进程中执行的Tcl脚本。这将是快速可靠的(多进程的东西需要上下文切换来进行通信,并且有更多的故障模式),并最大限度地减少所需的额外代码量。
Python唯一的问题是Tcl解释器(即Tcl_CreateInterp
返回的句柄)与当前线程强绑定;您无法从其他线程安全地调用它们(因为为了减少全局锁的数量,在实现内部使用了大量特定于线程的数据)。虽然我们可以讨论这些差异,但总的来说,这只是一种不同的做事方式;只有当你把事情联系在一起时,你才真正需要关心。如果你的Python代码实际上是单线程的,你可以跳过复杂性,直接访问最简单的东西;在某种程度上是不安全的,但在另一个层面上是安全的。
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- Pybind11:将元组列表从Python传递到C++
- 如何在c++中使用引用实现类似python的行为
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 递归列出所有目录中的C++与Python与Ruby的性能
- IPC使用多个管道和分支进程来运行Python程序
- 从python中调用C++函数并获取返回值
- Python 3.7 和 excess_args 的 SWIG 问题
- Python中的for循环与C++有何不同
- 使用Pybind11向Python公开Eigen::张量
- Python str to C++ to Python str
- 如何使用Python从C++中读取谷物序列化数据
- 如何在C++中使用pybind11加载一个pickle python列表
- 如何在c++中使用system()来运行包含空格的python脚本
- python集合的C++等价物是什么.计数器
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 从python调用openMP共享库时,未定义opnMP函数
- 使用JsonCpp将数据返回到带有pybind11的python会在python调用中产生Symbol not foun
- 如何将真正的字符串从python c-api转换为python脚本
- 同时支持Tcl和Python