Oppure

Loading
24/08/14 11:06
coreyt
Salve forum,
sto realizzando un programma in python che, tra le altre cose, offre all'utente la possibilità di importare un file .py nel quale sono definite funzioni dell'utente e, una volta importato, l'utente può richiamare queste sue funzioni direttamente dal programma in esecuzione.
Quello che mi blocca è come riuscire ad importare questo file in running, si dovrebbe poter fare in quanto il python è interpretato e successivamente si potrebbe richiamare la funzione tramite la riflessione, ma non capisco proprio come far ad importare il file .py dinamicamente. Qualche suggerimento?
Grazie a tutti per l'aiuto.
aaa
24/08/14 11:22
TheDarkJuster
Non conosco bene il pyton, ma non credo tu possa, almeno che non mi sia sfuggita l' esistenza di una libreria apposita. Aspetta risposte da chi lo conosce l'argomento meglio di me.

P.S. quello che tu chiami "running" si chiama run-time
Ultima modifica effettuata da TheDarkJuster 24/08/14 13:02
aaa
24/08/14 14:32
GN
Dovrebbe essere molto semplice da fare con la funzione exec(): docs.python.it/html/ref/…
Cioè, dovresti fare:
fileDaCaricare = "ilFileSceltoDallUtente"
exec("import " + fileDaCaricare)
exec(fileDaCaricare + ".funzione()")
aaa
26/08/14 14:23
coreyt
Grazie mille per la risposta. Confermo che con exec funziona ed ottengo proprio il risultato che voglio. Mi rimane solo un dubbio ora, come faccio a salvare in una variabile il risultato restituito da una funzione chiamata da exec?
Ho provato nei modi seguenti:
exec ("ris = somma (2, 3)")
ris = exec ("somma (2, 3)")

Ma in entrambi i casi senza successo.
aaa
26/08/14 16:35
TheDarkJuster
exec non ritorna alcun valore, ergo, non puoi fare ciò che vuoi fare.
Potresti invece provare eval se devi ritornare un valore
aaa
26/08/14 16:56
coreyt
Grazie per il suggerimento. Purtroppo se scrivo una riga di codice del tipo:
risultato = eval ("somma (1, 3)")

non funziona ed eval non mi ritorna il valore della funzione somma.
Non so, forse sbaglio io nell'uso di eval.
aaa
26/08/14 19:09
TheDarkJuster
scusa ma come ti ho già detto non conosco il python e ti ho solo riportato il risultato di una lunga ricerca. Ti posso inoltre dire che eval non funziona come exec. a quanto vedo eval ha parecchie limitazioni. Per esempio non puoi far stampare a schermo allo script da eseguire. Però puoi fare una cosa del genere:
x = eval(input("Angolo: "))
l = eval(input("Lato: "))
print eval("math.sin(x) * l")

aaa
30/08/14 0:42
coreyt
Alla fine ho risolto in questo modo:
modulo = sys.modules[nomemodulo]
metodo = getattr(modulo, "somma", None)
if callable(metodo):
            try:
                risultato = metodo (*parametri)
            except TypeError:
                pass

In pratica ho recuperato il riferimento al modulo attraverso la stringa nomemodulo che contiene il suo nome, ho usato la funzione getattr per recuperare il riferimento alla funzione "somma" e l'ho invocato salvando l'output nella variabile risultato.

Grazie a tutti per l'aiuto fornito.
aaa