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.tclSTDIN として設定します。vmd はprog.tcl完了 すると終了します
  • > LOG: STOUT をファイルに書き込みます<LOG>

私の Tcl スクリプトが引数を取ることを除いて、これは完全に機能します。私がやりたいことは次のようなものです:

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

ただし、この場合、シェルは string1 と string2 をファイルとして読み取ろうとします。リダイレクトについての私の理解が限られているため、最初の行で何が起こっているのか、2 番目の行で正確に何が間違っているのか、または適切な解決策が何であるかが正確にはわかりません。どんな助けでも大歓迎です。

4

3 に答える 3

1

申し訳ありませんが、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 が stdin で 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);

quitの最後に必ずステートメントを追加してくださいprogram.tcl

于 2010-12-13T21:15:13.617 に答える