Como usar a entrada do Python () com avaliação externa?
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
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[] *>"]