我的问题很简单:我正在尝试编写一个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}
感谢你的帮助,它已经解决了。
答案 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
(尽管它返回一个合适的通道句柄用于gets
和read
)等命令。
TkConsole实际上非常合理,因为快速而肮脏的终端模拟(因为它省略了许多复杂的情况)。真正的问题是,你对于你真正打字的内容并不一贯准确;这在大多数编程语言中都非常重要,而不仅仅是Tcl。你需要学会非常严格;创建问题时剪切粘贴有很大帮助。