可以在Bash或Python脚本中嵌入可被外部程序调用的TCL脚本吗?

1 投票
2 回答
4110 浏览
提问于 2025-04-16 05:26

我正在写一个脚本,用来提取一些我进行的化学模拟的有用数据。

为了获取这些数据,我需要 (1) 一个C程序,它可以从一种叫做 *.pdb 的文件中计算密度。我已经有了这个程序。还有 (2) 我需要使用一个叫 vmd 的程序来获取这个pdb文件。为了从命令行完成这一步,我可以提交一个tcl脚本,因为 vmd 内置了一个tcl解释器。

这些功能——调用vmd来运行tcl脚本,然后运行编译好的C程序——将是我这个数据提取脚本的关键活动。

我想去掉多余的TCL脚本,把我现在的两个脚本(一个是包装脚本,一个是vmd用的tcl脚本)减少到一个。但我不太确定怎么做。一个可能的解决方案是把我的TCL脚本嵌入到我的包装脚本中,如果有办法让这个嵌入的脚本可以被外部程序调用的话。

到目前为止,我的大部分数据收集脚本都是用BASH写的,所以我希望继续使用BASH脚本,因为我对BASH脚本很熟悉,而对Python和Perl的了解还只是初级。

以下是我的问题:
1. 可以把TCL脚本嵌入到Bash脚本中吗?
2. 可以让这个脚本被外部程序调用吗?
比如说,伪代码如下:

#!/bin/bash
....
tclembed extract {
   #tcl script
   ...
}
...
vmd -dispdev text -e extract.tcl >& extract_results.log #where vmd is 
                                                        #an external program

3. 如果问题#2的答案是否定的,那能不能用Python来实现,也许用Minotaur库?如果可以的话,我会考虑转向Python...
http://markmail.org/message/6kogjphzqtn4ilch
4. 如果不行,你有什么建议来尝试把这两个脚本(一个tcl例程和一个调用它的bash脚本)合并成一个文件?
5. 如果有人用Minotaur成功实现了这种外部调用,可以分享一些解释性的代码吗?

我想到一个非嵌入的解决方案来回答问题#4,那就是在我的Bash脚本中写一个函数,生成一个包含整个tcl脚本的文件。这样我就会有一个单一的脚本,但可以在需要时把子脚本导出给外部程序使用,之后再删除它。我觉得这个解决方案有点笨拙,虽然我知道它是可行的,而嵌入的解决方案可能更好。

2 个回答

1

1. 你能把TCL脚本嵌入到Bash脚本里吗?

不太容易。最好的办法是把脚本写到一个临时文件里,然后把这个文件的名字传给tclsh(如果是Tcl/Tk程序,就用wish)。这应该算是“编程的小事”,也就是说,虽然有点麻烦,但并不特别难。

2. 你能让这个脚本被外部程序调用吗?

我不太明白你想要做什么。你可以在Tcl脚本的开头加一行#!,然后把文件标记为可执行。这种方法效果很好。最好的做法是这个链接

#!/usr/bin/env tclsh8.5
your tcl script here...

3. 如果问题2的答案是否定的,那你能用Python做到吗?

这个维基页面提到了一种叫Typcl的东西,据说可以在Python中使用Tcl。我自己没有试过。

(我觉得问题4和5在我上面的回答中基本上不相关。)

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

这个有启发性。当然,它的输出是

Here's a bit of bash-iness.
Here I am, inside Tcl.
See?  I can do calculations:  8.

我用tclsh来写这个,但如果我没搞错的话,Jason R. Mick实际上会想用vmd。与vmd相对应的东西大概是

    ...
vmd -dispdev text -eofexit << HERE > output.log
$MYSCRIPT
HERE

虽然我能想到几种将bash和Tcl结合的方法,但我认为这个方法最符合原始问题的精神。

我还想指出,从我对vmd的了解来看,用Python代替Tcl也是完全合适的:vmd对这两者都很擅长。

最后,Python和Tcl都是通用编程语言,功能大致和bash相当,所以这个项目的另一个方向可以是完全用Tcl(或Python)来写,而不是bash。以上述方式嵌入脚本在Tcl(或Python)中和在bash中一样简单。

撰写回答