Comment utiliser input () de Python avec une évaluation externe?

Aug 27 2020

Je veux utiliser input () dans le code Python qui s'exécute dans le Wolfram Notebook.

Je crée donc une cellule d'évaluation externe en tapant ">" et en choisissant Python. Ensuite, je définis cette fonction:

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

Ensuite, j'essaye de l'appeler:

func()

ce qui fait fonctionner Mathematica pour toujours et ne pas évaluer.

Puis-je appeler input () de Python depuis le notebook?

2020-09-04 mise à jour. "input () lit à partir de l'entrée standard. Il n'y a pas d'entrée standard lors de l'utilisation d'un notebook."

oui, mais Jupyter le supporte cependant

Réponses

3 MichaelChen Sep 04 2020 at 23:14

J'ai trouvé une astuce en utilisant TemplateExpression <* *>et SetDelayed dans Mathematica.

À titre d'exemple, j'essaie de définir une fonction python comme celle-ci, qui duplique la chaîne d'entrée:

def func():
    return input()*2

le code Mathematica est:

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

(Notez que la fonction python inputest équivalente à la fonction Mathematica InputString)

Maintenant, la fonction funcdéfinie dans la session python peut obtenir une entrée du FrontEnd de Mathematica:

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

Je dois mentionner que cette astuce est assez limitée, par exemple,

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

renverra a Failure, car la fonction est effectivement définie dans Mathematica plutôt qu'en python. Pour éviter cela, utilisez

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