Использование Beakerx Custom Magic
Я создал собственную команду Magic с намерением генерировать искровой запрос программно. Вот соответствующая часть моего класса, которая реализует MagicCommandFunctionality:
MagicCommandOutcomeItem execute(MagicCommandExecutionParam magicCommandExecutionParam) {
// get the string that was entered:
String input = magicCommandExecutionParam.command.substring(MAGIC.length())
// use the input to generate a query
String generatedQuery = Interpreter.interpret(input)
MIMEContainer result = Text(generatedQuery);
return new MagicCommandOutput(MagicCommandOutcomeItem.Status.OK, result.getData().toString());
}
Это работает великолепно. Он возвращает команду, которую я сгенерировал. (Как текст)
У меня вопрос - как заставить ноутбук оценить это значение в ячейке? Я предполагаю, что SimpleEvaluationObject и TryResult участвуют, но я не могу найти примеры их использования
Вместо того, чтобы создавать MagicCommandOutput, я, вероятно, хочу, чтобы ядро создало его для меня. Я вижу, что KernelMagicCommand имеет метод execute, который сделает это. У кого-нибудь есть идеи?
1 ответ
Хорошо, я нашел один способ сделать это. Вот мое решение:
Вы можете запросить у текущего kernelManager ядро, которое вас интересует,
затем вызовите PythonEntryPoint.evaluate. Это похоже на работу!
@Override MagicCommandOutcomeItem execute (MagicCommandExecutionParam magicCommandExecutionParam) {
String input = magicCommandExecutionParam.command.substring(MAGIC.length() + 1)
// this is the Scala code I want to evaluate:
String codeToExecute = <your code here>
KernelFunctionality kernel = KernelManager.get()
PythonEntryPoint pep = kernel.getPythonEntryPoint(SCALA_KERNEL)
pep.evaluate(codeToExecute)
pep.getShellMsg()
List<Message> messages = new ArrayList<>()
//until there are messages on iopub channel available collect them into response
while (true) {
String iopubMsg = pep.getIopubMsg()
if (iopubMsg == "null") break
try {
Message msg = parseMessage(iopubMsg) //(I didn't show this part)
messages.add(msg)
String commId = (String) msg.getContent().get("comm_id")
if (commId != null) {
kernel.addCommIdManagerMapping(commId, SCALA_KERNEL)
}
} catch (IOException e) {
log.error("There was an error: ${e.getMessage()}")
return new MagicKernelResponse(MagicCommandOutcomeItem.Status.ERROR, messages)
}
}
return new MagicKernelResponse(MagicCommandOutcomeItem.Status.OK, messages)
}