Como usar a entrada do Python () com avaliação externa?

Aug 27 2020

Quero usar input () no código Python que é executado no Notebook Wolfram.

Portanto, crio uma célula de avaliação externa digitando ">" e escolhendo Python. Então eu defino esta função:

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

Então tento chamá-lo de:

func()

o que faz o Mathematica rodar para sempre e não avaliar.

Posso chamar input () do Python de dentro do notebook?

2020-09-04 updt. "input () lê da entrada padrão. Não há entrada padrão ao usar um notebook."

sim, mas Jupyter oferece suporte

Respostas

3 MichaelChen Sep 04 2020 at 23:14

Eu encontrei um truque usando TemplateExpression <* *>e SetDelayed no Mathematica.

Como exemplo, tento definir uma função Python como esta, que duplica a string de entrada:

def func():
    return input()*2

o código do Mathematica é:

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

(Observe que a função python inputé equivalente à função Mathematica InputString)

Agora, a função funcdefinida na sessão Python pode obter entrada do FrontEnd do Mathematica:

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

Devo mencionar que este truque é bastante limitado, por exemplo,

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

retornará a Failure, porque a função é efetivamente definida no Mathematica em vez de no python. Para evitar isso, use

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