Как прочитать данные из стандартного вывода в jatcl, запустив скрипт tcl в java
У меня есть два вопроса в принципе. Я использую интерпретатор JACL для запуска сценария TCL в JAVA.
Мои вопросы:
Как получить данные из стандартного вывода после запуска файла tcl?
Как передать аргументы для сценария 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.
- Как передать какой-то параметр
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 предназначен для интеграции на уровне результата интерпретатора, который я описал ранее; вам будет гораздо проще делать работу для чего-то сложного.