Как прочитать данные из стандартного вывода в jatcl, запустив скрипт tcl в java

У меня есть два вопроса в принципе. Я использую интерпретатор JACL для запуска сценария TCL в JAVA.

Мои вопросы:

  1. Как получить данные из стандартного вывода после запуска файла tcl?

  2. Как передать аргументы для сценария tcl при выполнении с использованием jatcl?

НАПРИМЕР:
sample.tcl:

`puts "Hi this is from tcl"  `

При запуске с использованием Java следующим образом:

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

тогда вывод будет записан на консоль стандартного доступа JAVA. Я хочу прочитать этот вывод для некоторой переменной, как x[] = i.eval("sample.tcl") тогда х должен содержать Привет это из tcl.

  1. Как передать какой-то параметр sample.tcl

1 ответ

Получить стандарт немного сложнее - вы должны проделать большую работу, создавая свой собственный экземпляр tcl.lang.channel.Channel а затем подключив это с TclIO.registerChannel(), что на самом деле не для кого-то, только начинающего - но вам часто не нужно делать это, если вы просто хотите общаться с программой Tcl. Результат скрипта (который не является стандартным выводом, а скорее результатом последней команды в скрипте) будет доступен через Interp"s 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());

Я действительно не рекомендую это. Я также не рекомендовал бы, если бы вы взаимодействовали с Tcl с любого другого языка (например, C или C++). Tcl предназначен для интеграции на уровне результата интерпретатора, который я описал ранее; вам будет гораздо проще делать работу для чего-то сложного.

Другие вопросы по тегам