Topic: import  (Letto 467 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Bocejo.py

  • python unicellularis
  • *
  • Post: 6
  • Punti reputazione: 0
    • Mostra profilo
import
« il: Maggio 03, 2018, 22:30 »
Ciao ragazzi,
sto cercando di realizzare un server rest a plugin, ovvero un normalissimo server rest dove posso aggiungere nuovi plugin semplicemente aggiungendo alla cartella "libs" un mio nuovo modulo di python.

lo struttura è questa:

- main.py
- Core
  -> fileCheAstraggonoilServerRest1.py
  -> fileCheAstraggonoilServerRest2.py

- libs
  -> __init__.py
  -> plugin1
     --> __init__.py
     --> file1.py
     --> file2.py

  -> plugin2
     --> __init__.py
     --> file1.py


in __init__.py della cartella libs c'è una funzione che scorre tutte le sue sottocartelle e fa si che in ognuna di esse il file __init__.py sia aggiornato con tutti i moduli presenti nella sottocartella stessa.

es. nell'__init__.py della cartella "plugin1" ci sarà scritto:
__all__ = ['file1', 'file2'] 


volevo sfruttare lo "__all__" dell'import di python per caricare dinamicamente tutti i plugin che andrò a creare senza ricordarmi di farlo da solo ma sto trovando qualche problema.

Problema:
come faccio, in main.py, a caricare tutti i plugin ed istanziarli (ciascuno è una classe)?

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.869
  • Punti reputazione: 9
    • Mostra profilo
Re:import
« Risposta #1 il: Maggio 04, 2018, 08:41 »
mah, per gli import dinamici esiste importlib.
Detto questo, non è la prima volta sul forum che qualcuno chiede come si fa a importare ed eseguire alla cieca codice arbitrario: ma anche dopo tanto tempo, questa idea resta pericolosa come la prima volta che qualcuno ci ha pensato.

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:import
« Risposta #2 il: Maggio 08, 2018, 14:15 »
come faccio, in main.py, a caricare tutti i plugin ed istanziarli (ciascuno è una classe)?

Non lo fai. Davvero. Nel senso che fare qualcosa che funziona in apparenza e' completamente ovvio. Una decente comprensione di SOLID e di un minimo di OOP e' sufficiente.  Quando uno poi comincia a progettare le cose per bene, si rende conto che non e' cosi' banale.

Ma d'altra parte che senso ha fare questa roba senza un framework opportuno?

Ed ecco qua, quello che vuoi, gia' pronto: https://docs.djangoproject.com/en/2.0/ref/applications/

Che io sappia flask non ha un esatto equivalente, ma dovresti potere combinare qualcosa con questo http://flask.pocoo.org/docs/1.0/blueprints/ e un pochetto di calci.

Ma chiaramente... a te non interessa la modularita'. Non hai formulato la domanda da quel punto di vista.
A te interessano "plugin". Ma siccome tanto anche questi vanno sotto code review e commit, non capisco che fastidio ti dia aggiornare due righe di configurazione e preferisci invece prenderti il rischio di avere un coso auto-maggico che a seconda di quello che trova puo' spaccarti il servizio.

Mi sembrano operations tafaziane.

Offline Bocejo.py

  • python unicellularis
  • *
  • Post: 6
  • Punti reputazione: 0
    • Mostra profilo
Re:import
« Risposta #3 il: Maggio 14, 2018, 23:43 »
Detto questo, non è la prima volta sul forum che qualcuno chiede come si fa a importare ed eseguire alla cieca codice arbitrario: ma anche dopo tanto tempo, questa idea resta pericolosa come la prima volta che qualcuno ci ha pensato.
perchè alla cieca scusa?
che pericoli può causare?
puoi essere più preciso?
grazie

Offline Bocejo.py

  • python unicellularis
  • *
  • Post: 6
  • Punti reputazione: 0
    • Mostra profilo
Re:import
« Risposta #4 il: Maggio 15, 2018, 00:01 »
Non lo fai. Davvero. Nel senso che fare qualcosa che funziona in apparenza e' completamente ovvio. Una decente comprensione di SOLID e di un minimo di OOP e' sufficiente.  Quando uno poi comincia a progettare le cose per bene, si rende conto che non e' cosi' banale.
riko non capisco perchè dare certe risposte, se sei così bravo a programmare non commentare post su un forum dove sai benissimo che potresti imbatterti in post di gente che non programma di lavoro.

Ma d'altra parte che senso ha fare questa roba senza un framework opportuno?
semplicemente non voglio legarmi ad un'architettura già definita e ben chiusa.
se volevo usare un framework non avrei aperto questo post oppure l'avrei fatto chiedendo dei consigli su quale framework usare.

Ed ecco qua, quello che vuoi, gia' pronto: https://docs.djangoproject.com/en/2.0/ref/applications/
google lo conosciamo tutti ;)

grazie comunque  :ok:

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.869
  • Punti reputazione: 9
    • Mostra profilo
Re:import
« Risposta #5 il: Maggio 16, 2018, 10:49 »
perchè alla cieca scusa?
che pericoli può causare?
puoi essere più preciso?
grazie

"Alla cieca" perché, per definizione, importi e quindi esegui codice che non conosci prima. Quindi, "alla cieca". Come "andare alla cieca", eccetera. E' un modo di dire. Capisci? Alla cieca: l'avrai forse già sentito.

Che pericoli può causare? Beh, vediamo... lo stesso tipo di pericoli che avresti dando il tuo computer al primo che passa e dicendogli di usarlo come gli pare per un quarto d'ora. Tu dici che tutto andrà bene?

Posso essere più preciso? Mah, non saprei. Credo che dovresti sperimentare tu stesso: prestare il tuo computer a un estraneo per 15 minuti è un buon punto di partenza, davvero. Te lo consiglio.
Se vuoi la versione noiosa, quello che ottieni si chiama "arbitrary code execution" (cercalo su wikipedia)... con la differenza che in genere "arbitrary code execution" è intesa come l'effetto di una vulnerabilità, insomma di un baco molto grave. Nel tuo caso, invece, tu la intendi come una feature del tuo programma: "Guardate! Ho fatto un programma che permette di eseguire codice arbitrario sulla mia macchina, senza farvi fare la fatica di cercare un exploit! Non è una fantastica innovazione?".
Sì, in effetti, per qualche tipo di "utente" potrebbe essere un'idea interessante. 


Citazione
riko non capisco perchè dare certe risposte
Provo a indovinare: perché sono quelle giuste?

Citazione
semplicemente non voglio legarmi ad un'architettura già definita e ben chiusa.
Riko dice "un framework", non "quel tale framework". Sei libero di scriverti un framework da zero come piace a te, ma il concetto è che intorno a un lavoro del genere ci vuole un framework che te lo sostiene.
Dopo di che, non è che te la cavi con un "semplicemente". Devi *giustificare* perché "non vuoi legarti", che cosa intendi con "legarti", per quale motivo credi che django (per esempio) sia una "architettura già definita", e perché credi che sia "chiusa".
Ma tu, esattamente, che cosa *sai* di django?

Citazione
google lo conosciamo tutti
E invece secondo me non hai chiaro *che cosa* riko ti ha suggerito.
Quel meccanismo di django fa quello che vuoi tu, in modo migliore e più sicuro. Se proprio "non vuoi" usare django (boh), almeno dovresti conoscerlo: imparalo a fondo, capisci come funziona django.apps e che cosa fa, capisci quale problema risolve e in che modo. Prova a scrivere un'applicazione o due con quel sistema. Poi confronta tutto questo con il tuo problema, e cerca di comprendere il quadro concettuale in cui django inserirebbe il tuo specifico problema. Poi se non vuoi django, butta pure via django. Ma nel frattempo avrai I-M-P-A-R-A-T-O come fare cose come quelle che vuoi fare.

Purtroppo, spesso nella programmazione non ci sono risposte facili, ricette da applicare in cinque minuti. Se vuoi puoi prendertela con chi ti dice che non ci sono ricette facili (che cattvoni che siamo, non vogliamo mai "aiutare"!). Come credi, ma stai solo sparando al messaggero. Il messaggio però resta quello.
« Ultima modifica: Maggio 16, 2018, 11:32 da RicPol »

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.651
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re:import
« Risposta #6 il: Maggio 16, 2018, 18:50 »
+1


Ammirevole il voler scrivere un framework, un po' meno il non voler imparare lo stato dell'arte e come i framework attuali risolvono (o perché non lo fanno) i problemi tipici del contesto.


Nel caso attuale, il problema del caricamento dinamico del codice è una roba che c'è già dai tempi di C (vedi DLL), e se n'è discusso a pacchi, basta googlare cose come "dynamic code loading" o "dynamic code execution".
« Ultima modifica: Maggio 17, 2018, 00:43 da GlennHK »