2010-09-26 15 views
26

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

+0

stai scaricando su ssl o ogni router intermedio è affidabile? : P – aaronasterling

+0

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

risposta

43

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' …> 
>>> 
+0

Bello, mi sono chiesto questo per un po '. – intuited

+0

Esiste un trucco per consentire all'utente di "from foo import Foo"? In questo esempio, ricevo "ImportError: nessun modulo chiamato foo". –

+0

Vedere la mia risposta aggiornata. –

Problemi correlati