如何通过在java中运行tcl脚本来读取jatcl中标准输出的数据

时间:2014-10-24 04:49:03

标签: java tcl jacl

我基本上有两个问题。我正在使用JACL解释器在JAVA中运行TCL脚本。

我的问题是:

  1. 如何在运行tcl文件后从标准输出中获取数据?

  2. 如何在使用jatcl执行时为tcl脚本传递参数?

  3. E.G:
    sample.tcl:

    `puts "Hi this is from tcl"  `
    

    使用java运行时如下:

    `Interp i = new Interp();
     i.eval("source sample.tcl");`
    

    然后输出将写入JAVA的stdout控制台。我想将输出读取到某个变量,如x[] = i.eval("sample.tcl"),然后x应该包含Hi,这是来自tcl。

    1. 如何将某些参数传递给sample.tcl

1 个答案:

答案 0 :(得分:1)

标准化有点困难 - 您必须做很多工作来创建自己的tcl.lang.channel.Channel实例,然后用TclIO.registerChannel()插入,这对于某些人来说并不是真的开始 - 但如果您只是想与Tcl程序进行通信,则通常不需要这样做。脚本的结果(不是标准输出,而是脚本中最后一个命令的结果)将通过Interp的{​​{1}}方法提供在getResult()完成后。

eval

更有可能的是,一旦你Interp interp = new Interp(); interp.eval("source sample.tcl"); String result = interp.getResult().toString(); 脚本,你就会在同一个解释器中调用命令并检查他们的结果。这样做效果会好得多。

source

如果要传递更复杂的东西,最简单的方法是在调用脚本之前将要传递的值存储在Tcl变量中,然后可以在需要时将值从变量中拉出。 / p>

Interp interp = new Interp();
interp.eval("source sample.tcl");
String arg = "abc";
interp.eval("sampleCommand " + arg);
String result = interp.getResult().toString();

如果你坚持阅读脚本stdout,你可以试试这个:

interp.setVar("theVar", "the value, which may have spaces in it", 0);
interp.eval("sampleCommand $theVar");

我真的不推荐这个。如果您使用任何其他语言(例如,C或C ++)与Tcl进行交互,我也不会推荐它。 Tcl是设计以整合我前面描述的解释器结果级别;你会发现为复杂的事情做更容易。