Possiedo un server remoto affidabile che memorizza molti moduli Python personalizzati. Posso recuperarli via HTTP (ad esempio usando urllib2.urlopen
) come testo/semplice, ma non posso salvare il codice del modulo recuperato sul disco rigido locale. Come posso importare il codice come un modulo Python pienamente operativo, incluse le sue variabili globali e le sue importazioni?
Suppongo di dover utilizzare alcune combinazioni delle funzioni del modulo exec
e imp
, ma non sono riuscito a farlo funzionare ancora.Importazione dinamica del modulo Python
risposta
sembra che questo dovrebbe fare il trucco: importing a dynamically generated module
>>> import imp >>> foo = imp.new_module("foo") >>> foo_code = """ ... class Foo: ... pass ... """ >>> exec foo_code in foo.__dict__ >>> foo.Foo.__module__ 'foo' >>>
Inoltre, come suggerito nell'articolo ActiveState, si potrebbe desiderare di aggiungere il nuovo modulo a sys.modules
:
>>> import sys >>> sys.modules["foo"] = foo >>> from foo import Foo <class 'Foo' …> >>>
Bello, mi sono chiesto questo per un po '. – intuited
Esiste un trucco per consentire all'utente di "from foo import Foo"? In questo esempio, ricevo "ImportError: nessun modulo chiamato foo". –
Vedere la mia risposta aggiornata. –
Ecco qualcosa Ho inserito un segnalibro un po 'indietro che copre qualcosa di simile:
È un po 'oltre quello che vuoi, ma l'idea di base è lì.
stai scaricando su ssl o ogni router intermedio è affidabile? : P – aaronasterling
In realtà, sì - sia lo storage del modulo che il server front-end fanno parte di un singolo sistema (e sono persino situati nella stessa stanza del server). Per ora, supponiamo che non ci siano implicazioni sulla sicurezza: anche se scarico il codice su SSL, la questione su come interpretarla è ancora valida. – dpq