0

我的问题很简单:我正在尝试编写一个 tcl 脚本来使用 $grofile 而不是每次我需要这个文件名时都编写。所以,我在 TkConsole 中所做的是:

% set grofile "file.gro"

% mol load gro ${grofile}

而且,确实,我成功上传了文件。在脚本中我有相同的行,但仍然有这个错误:

错误 #args: 应该是“set varName ?newValue?”

无法读取“grofile”:没有这样的变量

我试图解决我的问题

% set grofile [./file.gro]

我有这个错误,

无效的命令名称“./file.gro”

无法读取“grofile”:没有这样的变量

我也试过

% set grofile [file ./file.gro r]

我又遇到了第一个错误。

我还没有找到任何简单的方法来避免使用我要上传的文件的显式名称。似乎您只能使用最琐碎但乏味的方式:

mol load file.gro
mol addfile file.xtc

等等等等...

你能帮我简单解释一下为什么在 TkConsole 中我可以上传文件并将其用作变量,而我不能在 tcl 脚本中使用吗?另外,如果您知道我的错误在哪里,我将不胜感激。

如果它是基本的,我很抱歉,但我找不到任何答案。谢谢。

我添加了我的脚本的头部:

set grofile "sim.part0001_protein_lipid.gro"
set xtcfile "protein_lipid.xtc"
set intime  "0-5ms"
set system  "lower"
source view_change_render.tcl
source cg_bonds.tcl

mol load gro $grofile xtc ${system}_${intime}_${xtcfile}

已解决,感谢您的帮助。

4

1 回答 1

0

您可能认为您输入了相同的内容,但您没有。我猜你的真实文件名中有空格,并且你没有在它周围加上双引号。这会令人困惑set,因为 Tcl 的通用解析器最终会给出set比预期更多的参数。(Tcl 的通用解析器知道set只接受一两个参数,根据该语言的长期政策。)

所以你真的应该这样做:

set grofile "file.gro"

如果您有一个复杂的名称,请不要忽略双引号。


此外,这不起作用:

set grofile [./file.gro]

因为[...<code>] 用于指示将某些内容作为命令运行并使用其结果。虽然./file.gro实际上是 Tcl 中的合法命令名称,但它……极不可能。

这不起作用:

set grofile [file ./file.gro r]

因为该file命令需要一个子命令作为第一个参数。您给出的单词不是标准file子命令之一,而且它们都不接受那些看起来适合的参数open(尽管它返回适合与和之类的命令一起使用的通道句柄)。getsread


TkConsole 实际上是相当合理的,因为快速和肮脏的终端仿真去(考虑到它省略了很多复杂的情况)。真正的问题是你对你真正输入的内容并没有始终如一的准确。这在大多数编程语言中都非常重要,而不仅仅是 Tcl。你需要学会严格要求;创建问题时进行剪切粘贴很有帮助。

于 2016-06-23T09:49:57.427 回答