2

我正在使用 VMD(一个分子动力学可视化包),我想从 Perl 脚本打开 VMD,运行 Tcl 脚本,将输出打印到日志文件,然后关闭 VMD 并返回到 Perl 脚本。执行此操作的普通语法是:

system("vmd -dispdev text -eofexit < program.tcl > LOG");

据我所知,分解如下:

  • system("");:执行包含在引号中的 Bourne Shell 命令
  • vmd: 调用 VMD
  • -dispdev text: 以文本模式打开 VMD
  • -eofexit: 当达到 STDIN 上的 EOF 时终止 VMD
  • < prog.tcl:设置prog.tcl为标准输入;prog.tclvmd 将在完成 时终止
  • > LOG: 将 STOUT 写入文件<LOG>

现在这将完美地工作,除了我的 Tcl 脚本需要参数。我想做是:

system("vmd -dispdev text -eofexit < program.tcl string1 string2 > LOG");

但是,在这种情况下,shell 会尝试将 string1 和 string2 作为文件读取。由于我对重定向的理解有限,我不确定第一行到底发生了什么,第二行到底出了什么问题,或者什么是好的解决方案任何帮助,将不胜感激。

4

3 回答 3

1

抱歉,当 Tcl 脚本在另一个程序(如 vmd)中执行时,不要认为您可以直接将参数传递给您的 Tcl 脚本。我建议通过文件传递参数作为解决方法。例如。在 Perl 脚本中,在调用 vmd 之前,将参数写入 Tcl 语法的文件中:

open PARAMS, '>myparams.tcl';
print PARAMS "set arg1 $string1; set arg2 $string2";
close PARAMS;

然后在 program.tcl 的开头,而不是使用命令行参数 ($argv),让它读取参数文件以获取参数值:

source myparams.tcl
于 2009-07-28T09:22:37.143 回答
0

您正在做的是将 program.tcl 文件的内容发送到 vmd,而不是执行程序的输出。如果我理解你,你想用管道将 Tcl 程序连接到 vmd:

system("program.tcl arg1 arg2 | vmd -... > output.file");

编辑:

因此,如果 vmd 在标准输入上读取 Tcl 代码,您仍然可以在不使用临时文件的情况下传递参数:

system("( echo 'set arg1 str1; set arg2 str2'; cat program.tcl; ) | vmd ... > output_file");

或者

open my $fh, '<', 'program.tcl';
my @tcl = <$fh>;
close $fh;
unshift @tcl, "set arg1 str1\n", "set arg2 str2\n";
open $fh, '|-', 'vmd ... > output.file' or die 'msg...';
print $fh join('', @tcl);
close $fh or die 'msg...';
于 2009-07-28T14:02:00.267 回答
0

您可以通过执行类似的操作将参数直接传递给 VMD

system(vmd -dispdev text -e program.tcl -args string1 string2 > LOG);

确保quitprogram.tcl.

于 2010-12-13T21:15:13.617 回答