我基本上有两个问题。我正在使用JACL解释器在JAVA中运行TCL脚本。
我的问题是:
如何在运行tcl文件后从标准输出中获取数据?
如何在使用jatcl执行时为tcl脚本传递参数?
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。
sample.tcl
答案 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是设计以整合我前面描述的解释器结果级别;你会发现为复杂的事情做更容易。