Skip to main content
 首页 » 编程设计

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

2025年05月04日19zhujiabin

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

要获取此数据,我需要 (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 脚本写入一个文件。这样我就只有一个脚本,但可以转储下标以供外部程序使用,稍后将其删除。我觉得这个解决方案有点笨拙,尽管我确信它与嵌入式解决方案相比有效。

请您参考如下方法:

有几种 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)编写它,而不是庆典。以上述方式嵌入脚本至少在 Tcl(或 Python)中与在 bash 中一样容易。