差异tcl脚本tkconsole在VMD中加载gro文件

时间:2016-06-22 21:57:53

标签: tcl vmd

我的问题很简单:我正在尝试编写一个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}

感谢你的帮助,它已经解决了。

1 个答案:

答案 0 :(得分:0)

你可能认为你输入了同样的东西,但你还没有。我猜你的真实文件名中有空格,并且你没有在它周围添加双引号。这会让set感到困惑,因为Tcl的一般解析器最终会提供比预期更多的set个参数。 (Tcl的一般解析器不会知道set只需要一个或两个参数,通过该语言的长期策略。)

所以你应该 真的 做:

set grofile "file.gro"

如果您的名字很复杂,请不要将双引号退出

此外,这不会起作用:

set grofile [./file.gro]

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

这不会起作用:

set grofile [file ./file.gro r]

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

TkConsole实际上非常合理,因为快速而肮脏的终端模拟(因为它省略了许多复杂的情况)。真正的问题是,你对于你真正打字的内容并不一贯准确;这在大多数编程语言中都非常重要,而不仅仅是Tcl。你需要学会非常严格;创建问题时剪切粘贴有很大帮助。