2011-09-19 17 views
7

Voglio utilizzare un modulo, ad es. BeautifulSoup, nel mio codice Python, così io di solito aggiungere questo alla parte superiore del file:Importare un modulo in Python solo se non esiste già

from BeautifulSoup import BeautifulSoup 

Tuttavia, quando distribuisco il modulo che sto scrivendo, gli altri non possono avere BeautifulSoup, quindi mi limiterò a includo nella mia struttura di directory in questo modo:

Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
d----   9/19/2011 5:45 PM   BeautifulSoup 
-a---   9/17/2011 8:06 PM  4212 myscript.py 

Ora, il mio file myscript.py modificato sarà simile a questa in cima al riferimento alla copia locale di BeautifulSoup:

from BeautifulSoup.BeautifulSoup import BeautifulSoup, CData 

Ma cosa succede se il dev eloper che usa la mia libreria ha già installato BeautifulSoup sul loro computer? Voglio modificare myscript.py in modo che controlli per vedere se BeautifulSoup è già installato, e se è così, usa il modulo standard. Altrimenti, usa quello incluso.

Utilizzando Pseudo-python:

if fBeautifulSoupIsInstalled: 
    from BeautifulSoup import BeautifulSoup, CData 
else: 
    from BeautifulSoup.BeautifulSoup import BeautifulSoup, CData 

è possibile? Se é cosi, come?

+1

Tratto da http://effbot.org/zone/import-confusion.htm: 'Quando Python importa un modulo, prima controlla il Registro di sistema del modulo (sys.modules) a vedere se il modulo è già stato importato. In questo caso, Python utilizza l'oggetto modulo esistente così com'è. – mwan

+0

Prova ad importarlo. Se non funziona, cattura ImportError e importa dalla tua copia locale. Assegna un nome alla tua copia locale qualcos'altro (myBeautifulSoup) in modo che non nasconda il modulo installato dall'utente. –

+0

@mwan: Ben non ha bisogno di sapere se è già * importato *, ha bisogno di sapere se è * già nel sistema *. –

risposta

15

Di solito il seguente schema è utilizzato per gestire questa situazione in Python.

Per prima cosa rinominare il modulo BeautifulSoup, ad es. MyBeautifulSoup

Poi:

try: 
    import BeautifulSoup # Standard 
except ImportError: 
    import MyBeautifulSoup as BeautifulSoup # internal distribution 
Problemi correlati