2015-02-03 16 views
11

Come esperimento, voglio vedere come importare un modulo Python da un URL. L'obiettivo ipotetico qui sarebbe quello di importare da una posizione centrale che mantiene aggiornati i moduli. Come si può fare?Come può un modulo Python essere importato da un URL?

mio tentativo è il seguente:

>>> import urllib 
>>> 
>>> def import_URL(URL): 
...  exec urllib.urlopen(URL) in globals() 
... 
>>> import_URL("https://cdn.rawgit.com/wdbm/shijian/master/shijian.py") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in import_URL 
TypeError: exec: arg 1 must be a string, file, or code object 

EDIT: Martijn Pieters identificarono una correzione per il codice di esempio che determina la rappresentazione di stringa del modulo remoto. Il codice risultante è il seguente:

import urllib 
def import_URL(URL): 
    exec urllib.urlopen(URL).read() in globals() 
+3

Davvero non dovresti. Non caricare codice su Internet ed eseguirlo, a meno che non si voglia essere hackerati. Detto questo, il tuo unico errore non è chiamare '.read()' sul risultato 'urlopen()'. –

+2

Invece di caricare da un URL, utilizzare un sistema di controllo di revisione (git, mercurial, ecc.) Per mantenere il codice aggiornato. –

+0

[Martijn Pieters] (http://stackoverflow.com/users/100297/martijn-pieters) Grazie per i vostri commenti lì e per individuare il problema '' 'read()' ''. Ciò si traduce in una stringa che può essere eseguita. Sono a conoscenza dei problemi di sicurezza; questo è solo per scopi sperimentali. Sai se c'è qualche sforzo per avere un approccio più sicuro a questa idea? – d3pd

risposta

1

Sì, è possibile.

Basta prendere il modulo con l'url e una volta che lo avete conservarla come una stringa in cui è possibile eseguire utilizzando eval()

Utilizzando urllib e eval può essere fatto facilmente:

import urllib.request 
a = urllib.request.urlopen(url) 
eval(a.read()) 

Do si noti che alcuni moduli (come Pygame e Pydub) richiedono runtime e non possono essere eseguiti utilizzando eval() a causa dei runtime mancanti.

Buona fortuna per il tuo progetto, spero di averlo aiutato.