2010-06-28 19 views
21

Questo probabilmente ha una risposta ovvia, ma sono un principiante. Ho un "modulo" (in realtà solo un file con un sacco di funzioni che uso spesso) all'inizio del quale importa un certo numero di altri moduli. Poiché lavoro su molti sistemi, tuttavia, non tutti i moduli possono essere caricati su una particolare macchina. Per rendere le cose un po 'più difficili, cambio anche i nomi dei pacchetti quando li importa - per esempio, matplotlib viene abbreviato in mp.Errore durante la fase di importazione dei moduli

Quello che mi piacerebbe fare è caricare solo quei moduli che esistono sul sistema che sto usando attualmente, e fare un po 'di gestione degli errori su quelli che non lo fanno. L'unico modo in cui posso pensare di farlo è racchiudendo ciascuna istruzione import all'interno del proprio blocco try, che sembra piuttosto poco sdolcinato. Se li accludo tutti nello stesso blocco try, qualunque modulo lanci un errore impedirà il caricamento dei moduli successivi. Qualche idea che potrebbe far sembrare le cose più belle? Sarebbe così facile se non volessi cambiare il loro nome ...

+2

il modulo "imp" dovrebbe aiutare. potresti leggere questo: http://docs.python.org/library/imp.html – mawimawi

+1

@mawimawi: come? Per favore spiega ed espandi il tuo commento in una risposta adeguata? (Ho letto il documento e non è ovvio perché vorremmo usare quel modulo più di ogni altro approccio ) – smci

risposta

30

Non penso che il blocco try except sia non-pirolitico; invece è un modo comune per gestire l'importazione su Python.

Citando Dive into Python:

Ci sono un sacco di altri usi per eccezioni oltre a gestire effettivi condizioni di errore. Un uso comune nella libreria standard Python consiste nel provare a importare un modulo e quindi controllare se ha funzionato. L'importazione di un modulo che non esiste solleverà un'eccezione ImportError . È possibile utilizzare per definire molteplici livelli di funzionalità basato su quali moduli sono disponibili in fase di esecuzione, o per supporto più piattaforme (dove codice specifico della piattaforma è separata nei moduli differenti).

Il prossimo esempio dimostra come utilizzare un'eccezione per supportare la funzionalità specifica della piattaforma .

try: 
    import termios, TERMIOS      
except ImportError: 
    try: 
     import msvcrt       
    except ImportError: 
     try: 
      from EasyDialogs import AskPassword 
     except ImportError: 
      getpass = default_getpass   
     else:         
      getpass = AskPassword 
    else: 
     getpass = win_getpass 
else: 
    getpass = unix_getpass 
4

Il modo più semplice è quello di garantire che tutti i moduli possono essere caricati su tutti i sistemi. Se ciò non funziona, allegare ciascuna istruzione import in un blocco try è la soluzione migliore successiva e non un-Pythonic.

0

Come sostenuto da https://stackoverflow.com/a/20228312/1587329 [modifica]

named_libs = [('numpy', 'np'), ('matplotlib', 'mp')] # (library_name, shorthand) 
for (name, short) in named_libs: 
    try: 
     lib = __import__(name) 
    except: 
     print sys.exc_info() 
    else: 
     globals()[short] = lib 

importa tutte le librerie in named_libs. La prima stringa è il nome della libreria, la seconda la stenografia. Per le librerie senza nome, è possibile utilizzare the original:

libnames = ['numpy', 'scipy', 'operator'] 
for libname in libnames: 
    try: 
     lib = __import__(libname) 
    except: 
     print sys.exc_info() 
    else: 
     globals()[libname] = lib 
Problemi correlati