能否在外部程序可调用的 Bash 脚本或 Python 脚本中嵌入 TCL 脚本?

Jas*_*ick 1 python bash scripting tcl embedding

我正在编写一个脚本来提取有关我一直在运行的一系列化学模拟的一些有用数据。

要获得这些数据,我需要 (1) 一个 C 程序,该程序根据名为*.pdb. 我已经有了(1)。并且 (2) 我需要使用一个被调用的程序vmd来获取该 pdb。为了从命令行完成 (2),我可以提交一个 tcl 脚本,就像vmd在 tcl 解释器中构建一样。

这些函数——调用 vmd 来运行 tcl 脚本,然后运行编译好的 c 程序——将是我的包装器数据提取脚本的关键活动。

我想消除多余的 TCL 脚本,将我的数量从 2 个脚本(vmd 的包装脚本 + tcl 脚本)减少到 1 个。但我不太确定如何做到这一点。一个潜在的解决方案似乎是将我的 TCL 脚本嵌入到我的包装脚本中,如果有办法使这样的嵌入脚本可以从外部程序调用。

到目前为止,我的大部分数据收集脚本都是在 BASH 中编写的,因此理想情况下,我想坚持使用 BASH 脚本,因为我对 bash 脚本编写非常熟悉,而不是对 Python/Perl 仅有初步了解。

这是我的问题:
1. 你能在 Bash 脚本中嵌入一个 TCL 脚本吗?
2. 你能让这个脚本被外部程序调用吗?
例如在伪代码中:

#!/bin/bash
....
tclembed extract {
   #tcl script
   ...
}
...
vmd -dispdev text -e extract.tcl >& extract_results.log #where vmd is 
                                                        #an external program
Run Code Online (Sandbox Code Playgroud)

3. 如果 #2 的答案是否定的,你能在 Python 中做到这一点,也许使用 Minotaur 库?如果是这样,我会考虑切换到 python...
http://markmail.org/message/6kogjphzqtn4ilch
4. 如果不是,您如何建议尝试将这两个脚本(tcl 例程和调用它的 bash 脚本)合并到单个文件?
5. 如果有人收到这种性质的外部调用以使用 Minotaur 工作,您能发布一些解释性代码吗?

我想到了#4 的一种非嵌入解决方案,即在我的 Bash 脚本中编写一个函数,该函数使用整个 tcl 脚本编写一个文件。这样我就会有一个脚本,但可以转储下标以供外部程序使用,然后将其删除。我觉得这个解决方案有点笨拙,尽管我确信它与嵌入式解决方案相比有效。

Cam*_*ird 5

已经有几种 Tcl-Python 合金。正如 Rafe Kettler 在草图上的评论,开始的地方是标准的 Python 安装。这包括 Tkinter,它构建在一个完整的 Tcl 解释器中,可按照上述 Wiki 页面中的描述进行访问。因此,是的,“在 Python 中执行此操作”是可行的。

不过,我真的不明白这与vmd有什么关系。 vmd已经构建在 Tcl 解释器中。虽然我完全支持“减少活动部件”的目标,例如,当vmd已经公开 Tcl时,您有一个脚本,而不是两个脚本,用 Python 编写代码,这似乎不是朝着这个方向迈出的一步Jason R. Mick 想去。

稍后:在与 Jason R. Mick 交换意见后,我想到他可能会发现

#!/bin/bash


echo "Here's a bit of bash-iness."

MYSCRIPT='
puts "Here I am, inside Tcl."
puts "See?  I can do calculations:  [expr 3 + 5]."
exit 0
'

tclsh << HERE
$MYSCRIPT
HERE
Run Code Online (Sandbox Code Playgroud)

暗示。当然,它的输出是

Here's a bit of bash-iness.
Here I am, inside Tcl.
See?  I can do calculations:  8.
Run Code Online (Sandbox Code Playgroud)

我是用tclsh写的,但是,如果我跟上,Jason R. Mick 实际上会想要使用vmd。* vmd的适当同系物类似于

    ...
vmd -dispdev text -eofexit << HERE > output.log
$MYSCRIPT
HERE
Run Code Online (Sandbox Code Playgroud)

虽然我可以想到其他几种融合 bash 和 Tcl 的方法,但我相信这个方法最符合原始问题的精神。

我还想指出,根据我对vmd 的了解,用 Python 代替 Tcl 做同样的事情是完全合适的: vmd同样擅长于两者。

最后,Python 和 Tcl 都是通用语言,具有与bash大致相同的功能,因此该项目的另一个方向是完全用 Tcl(或 Python)而不是 bash 编写它。以上述方式嵌入脚本在 Tcl(或 Python)中至少与在 bash 中一样容易。