【问题标题】:Can You Embed an TCL Script in Bash Script or Python Script That's Callable by External Programs?您可以在外部程序可调用的 Bash 脚本或 Python 脚本中嵌入 TCL 脚本吗?
【发布时间】:2010-10-13 17:22:23
【问题描述】:

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

要获取此数据,我需要 (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 中(尽管形式有限)。见wiki.python.org/moin/How%20Tkinter%20can%20exploit%20Tcl/…
  • 那不只是TCL单线吗?我看到的所有示例都是单个命令。我想嵌入一个完整的连续脚本,例如用三重引号。 “”“”“”。这就是我准备好的牛头怪。

标签: python bash scripting tcl embedding


【解决方案1】:

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

真的不明白这与 vmd 有什么关系。 vmd 已经内置了 Tcl 解释器。虽然我完全支持“减少活动部件”的目标,例如,你有一个脚本,而不是两个,在 Python 中编码一些东西,当 vmd 已经暴露了 Tcl 时,不会似乎朝着 Jason R. Mick 想要的方向迈出了一步。

稍后:在与 Jason R. Mick 交换 cmets 后,我想到他可能会找到

#!/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 中一样容易。

【讨论】:

  • 重读我的问题描述。我想嵌入一个可以提交给我调用的外部程序的 tcl 脚本。无论脚本是嵌入的还是单独的文件中,我都需要 vmd 来运行此脚本以生成我的数据。理想情况下,我想将脚本嵌入到我的包装器(BASH 脚本)中,从我的包装器调用 vmd,将嵌入的脚本交给它,然后在我的包装器脚本中处理结果(调用我的 c 程序等)。只有(1)个工作部分。我认为您没有理解我的问题描述。
  • 你最后忘记了vmd -dispdev text -eofexit &lt;&lt; HERE &gt; output.log。发布编辑,请尽可能!做得很好!
【解决方案2】:

1.你能在 Bash 脚本中嵌入 TCL 脚本吗?

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

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

我不太明白你想在这里做什么。您可以在 Tcl 脚本的开头放置 #! 行并将文件标记为可执行文件。效果很好。最好的方法是this:

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

3. 如果#2 的答案是否定的,你能在 Python 中做到这一点吗?

This wiki page 提到了一个叫做 Typcl 的东西,据报道它允许从 Python 内部执行 Tcl。没试过。

(根据我上面的回答,我认为问题 4 和 5 在很大程度上是不相关的。)

【讨论】:

  • 您对 1) 的回答与我在最后一段中的建议相呼应,所以我已经想通了。 :o) 让我看看我是否可以澄清#2。我当然了解如何使 tcl 可执行。我的问题是您是否可以在 BASH(或 PYTHON 文件)中嵌入 TCL 下标并使该嵌入脚本可由外部程序调用。例如,就我而言,我假设的 bash 脚本将包含 TCL 下标。然后我会从 BASH 脚本中调用一个外部程序 (vmd),并将这个下标作为参数传递给它。 (续)
  • 使用单独的 TCL 脚本违背了我的整个前提——将我的脚本数量从两个减少到一个通用脚本。至于您对#3 的回答,根据我之前的阅读,如果我理解正确的话,Python 中的 Typcl 接口仅对解释单个命令有用,而 Minotaur 提供了可以嵌入的整个脚本。因此,如果我理解正确,这将不是无关紧要的......而且您的回复仍然没有说明您是否可以嵌入脚本并在您的 python 脚本中调用外部程序,将该外部程序传递给您的嵌入式脚本。
  • @Jason:您可以包装一些东西,以便它根据其内容(存储在 shell 脚本中)构建单独的脚本并将其写入临时文件。但是,您缺少的是 tclsh 通过某种 -e 选项从命令行获取脚本的一种方式(与其他程序类似);你错过了它,因为 tclsh 只是没有。
  • 我肯定迷路了,多纳尔。如果缺少 -e 是唯一的困难,我们可以提供“expect -c ...”或提出诸如“tclsh this_script.tcl 是“外部程序”,是的,在 bash 脚本中嵌入 Tcl 脚本、提取嵌入的 Tcl 脚本并执行任何预期的操作是非常可行的 -虽然-我-不明白-它。
  • 卡梅隆(在某种程度上)是正确的。如果 tcl 脚本是一个单独的文件,无论您是否使 tcl 脚本可执行,vmd 都可以理解它并使用其解释器执行它。即 vmd -e my.tcl 无论 my.tcl 是否以 tclsh 位置开头都有效。我的问题是是否有更优雅的方式将脚本(例如 my.tcl)嵌入 bash,然后将其交给 vmd,而不仅仅是将文本转储到 my.tcl。如果我理解正确的话,你和我都提出了一种文本转储类型的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 2012-06-08
相关资源
最近更新 更多