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

时间:2010-10-13 17:22:23

标签: 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

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

我想到了#4的一个非嵌入式解决方案,它将在我的Bash脚本中编写一个函数,该函数使用整个tcl脚本编写一个文件。这样我会有一个脚本,但可以转储下标以供外部程序使用,稍后删除它。我觉得这个解决方案有点笨拙但我知道它确实有效,而不是嵌入式解决方案。

2 个答案:

答案 0 :(得分:4)

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

确实没有得到与 vmd 有关的内容。 vmd 已经在Tcl解释器中构建。虽然我完全支持“减少移动部件”的目的,但是当你 vmd 已暴露Tcl时,你有一个脚本,而不是两个,用Python编写代码,而不是似乎是Jason R. Mick想要走的方向的一步。

SOMEWHAT后来:在与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中一样容易。

答案 1 :(得分:1)

  

1.您可以在Bash脚本中嵌入TCL脚本吗?

不容易。最好的方法是将脚本写入临时文件,并将该文件的名称传递给tclsh(如果是Tcl / Tk程序,则传递给wish)。这应该是一个“简单的编程问题”,即一些笨拙的编码,但从根本上来说并不困难。

  

2.您可以通过外部程序调用此脚本吗?

我不太明白你想在这做什么。您可以在Tcl脚本的开头放置#!行并标记文件可执行文件。这很好用。所有这一切的最佳方式是this

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

3.如果#2的答案为否,你能用Python做到这一点吗?

This wiki page提到了一个名为Typcl的东西,据报道它允许从Python内部执行Tcl。我从未尝试过。

(我认为问题4和5在很大程度上与我上面的答案无关。)