Как использовать Python input () с внешней оценкой?

Aug 27 2020

Я хочу использовать input () в коде Python, который работает в Wolfram Notebook.

Итак, я создаю внешнюю ячейку оценки, набрав «>» и выбрав Python. Затем я определяю эту функцию:

def func():
    x = input()
    print(x)

Тогда я пытаюсь назвать это:

func()

что заставляет Mathematica работать вечно, а не оценивать.

Могу ли я вызвать Python input () из записной книжки?

2020-09-04 обновление. «input () читает из стандартного ввода. При использовании записной книжки нет стандартного ввода».

да, но Jupyter поддерживает его, хотя

Ответы

3 MichaelChen Sep 04 2020 at 23:14

Я нашел уловку, используя TemplateExpression <* *>и SetDelayed в Mathematica.

В качестве примера я пытаюсь определить такую ​​функцию python, которая дублирует входную строку:

def func():
    return input()*2

код Mathematica:

pysession = StartExternalSession["Python"];
wlfunc[] := ExternalEvaluate[pysession, "<* InputString[] *> *2"]
ExternalEvaluate[pysession, "func = <* wlfunc *>"]

(Обратите внимание, что функция python inputэквивалентна функции Mathematica InputString)

Теперь функция, funcопределенная в сеансе python, может получать входные данные из FrontEnd системы Mathematica:

ExternalEvaluate[pysession, "[func() for i in range(3)]"]

Я должен отметить, что этот трюк довольно ограничен, например,

ExternalEvaluate[pysession, "func() + func()"]

вернет a Failure, потому что функция фактически определена в Mathematica, а не в python. Чтобы этого избежать, используйте

ExternalEvaluate[pysession, "<* wlfunc[] *> + <* wlfunc[] *>"]