Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Python - Importare file py in
Forum - Python - Importare file py in "running"

Avatar
coreyt (Normal User)
Rookie


Messaggi: 21
Iscritto: 28/02/2010

Segnala al moderatore
Postato alle 13:06
Domenica, 24/08/2014
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.

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 13:22
Domenica, 24/08/2014
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 il 24/08/2014 alle 15:02
PM Quote
Avatar
GN (Member)
Guru


Messaggi: 772
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 16:32
Domenica, 24/08/2014
Dovrebbe essere molto semplice da fare con la funzione exec(): http://docs.python.it/html/ref/exec.html
Cioè, dovresti fare:
Codice sorgente - presumibilmente Plain Text

  1. fileDaCaricare = "ilFileSceltoDallUtente"
  2. exec("import " + fileDaCaricare)
  3. exec(fileDaCaricare + ".funzione()")


PM Quote
Avatar
coreyt (Normal User)
Rookie


Messaggi: 21
Iscritto: 28/02/2010

Segnala al moderatore
Postato alle 16:23
Martedì, 26/08/2014
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:
Codice sorgente - presumibilmente Python

  1. exec ("ris = somma (2, 3)")
  2. ris = exec ("somma (2, 3)")


Ma in entrambi i casi senza successo.

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 18:35
Martedì, 26/08/2014
exec non ritorna alcun valore, ergo, non puoi fare ciò che vuoi fare.
Potresti invece provare eval se devi ritornare un valore

PM Quote
Avatar
coreyt (Normal User)
Rookie


Messaggi: 21
Iscritto: 28/02/2010

Segnala al moderatore
Postato alle 18:56
Martedì, 26/08/2014
Grazie per il suggerimento. Purtroppo se scrivo una riga di codice del tipo:
Codice sorgente - presumibilmente Python

  1. 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.

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 21:09
Martedì, 26/08/2014
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:
Codice sorgente - presumibilmente Python

  1. x = eval(input("Angolo: "))
  2. l = eval(input("Lato: "))
  3. print eval("math.sin(x) * l")



PM Quote
Avatar
coreyt (Normal User)
Rookie


Messaggi: 21
Iscritto: 28/02/2010

Segnala al moderatore
Postato alle 2:42
Sabato, 30/08/2014
Alla fine ho risolto in questo modo:
Codice sorgente - presumibilmente Python

  1. modulo = sys.modules[nomemodulo]
  2. metodo = getattr(modulo, "somma", None)
  3. if callable(metodo):
  4.             try:
  5.                 risultato = metodo (*parametri)
  6.             except TypeError:
  7.                 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.

PM Quote