Come utilizzare input () di Python con la valutazione esterna?

Aug 27 2020

Voglio usare input () nel codice Python che viene eseguito in Wolfram Notebook.

Quindi creo una cella di valutazione esterna digitando ">" e scegliendo Python. Quindi definisco questa funzione:

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

Quindi provo a chiamarlo:

func()

che fa funzionare Mathematica per sempre e non valutare.

Posso chiamare input () di Python dall'interno del notebook?

2020-09-04 aggiornamento "input () legge dallo standard input. Non esiste input standard quando si utilizza un notebook."

sì, ma Jupyter lo supporta comunque

Risposte

3 MichaelChen Sep 04 2020 at 23:14

Ho trovato un trucco usando TemplateExpression <* *>e SetDelayed in Mathematica.

Ad esempio, provo a definire una funzione python come questa, che duplica la stringa di input:

def func():
    return input()*2

il codice Mathematica è:

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

(Nota che la funzione python inputè equivalente alla funzione Mathematica InputString)

Ora, la funzione funcdefinita nella sessione python può ricevere input dal FrontEnd di Mathematica:

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

Devo dire che questo trucco è piuttosto limitato, ad esempio,

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

restituirà a Failure, perché la funzione è effettivamente definita in Mathematica piuttosto che in python. Per evitare ciò, usa

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