获得标准有点困难——你必须做很多工作来创建自己的 a 实例,tcl.lang.channel.Channel
然后将其插入到 中TclIO.registerChannel()
,这并不适合刚开始的人——但你通常不需要这样做如果您只是想与 Tcl 程序进行通信。脚本的结果(不是标准输出,而是脚本中最后一个命令的结果)将在完成后通过Interp
'getResult()
方法eval
获得。
Interp interp = new Interp();
interp.eval("source sample.tcl");
String result = interp.getResult().toString();
更有可能的是,一旦你source
编写了脚本,你就会在同一个解释器中调用命令并检查它们的结果。那效果要好得多。
Interp interp = new Interp();
interp.eval("source sample.tcl");
String arg = "abc";
interp.eval("sampleCommand " + arg);
String result = interp.getResult().toString();
如果你想传递更复杂的东西,最简单的方法是在调用脚本之前将你想传递的值存储在一个 Tcl 变量中,然后它可以在需要时将值从变量中提取出来。
interp.setVar("theVar", "the value, which may have spaces in it", 0);
interp.eval("sampleCommand $theVar");
如果你坚持阅读脚本标准输出,你可以试试这个:
Interp interp = new Interp();
TclByteArrayChannel tbac = new TclByteArrayChannel(interp);
// WARNING untested, but I think you have to unregister the old stdout first
TclIO.unregisterChannel(interp, TclIO.getStdChannel(StdChannel.STDOUT));
TclIO.registerChannel(interp, tbac);
interp.eval("source sample.tcl");
// The channel will have had *bytes* written to it, so that's what we ought to get
byte[] bytes = TclByteArray.getBytes(interp, tbac.getTclByteArray());
我真的不推荐这个。如果您使用任何其他语言(例如,C 或 C++)与 Tcl 交互,我也不推荐它。Tcl 被设计为在我之前描述的解释器结果级别进行集成;你会发现处理任何复杂的事情都容易得多。