2010-06-28 51 views
21

Muhtemelen açık bir cevabı vardır, ancak yeni başlayan biriyim. Başta başka bir çok modüle sahip olduğum bir "modül" (başlangıçta sık kullandığım bir grup fonksiyona sahip bir dosya) var. Ancak, birçok sistem üzerinde çalıştığım için, tüm modüller belirli bir makineye yüklenemeyebilir. Bazı şeyleri daha da zorlaştırmak için, onları içe aktardığım zaman paketlerin isimlerini değiştiriyorum - örneğin, matplotlib mp olarak kısaltılır. Ben yapmak istiyorum neModülleri içe aktarırken hata oluştu

Şu anda kullanarak sistemde kayıtlı olan modülleri yüklemek ve yok olanlar işleme bazı hata yapmak sadece. Bunu yapmayı düşünebilmemin tek yolu, her bir içe aktarma ifadesini kendi deneme bloğu içine almaktır. Hepsini aynı try bloğuna kapatırsam, modül bir hata atarsa, sonraki modüllerin yüklenmesini engeller. İşleri daha güzel gösterebilecek herhangi bir fikir var mı?

+2

. http://docs.python.org/library/imp.html – mawimawi

+1

@mawimawi: Bunu nasıl okumak isteyebilirsiniz? Lütfen yorumunuzu açık bir cevaba göre açıklayın ve genişletin mi? (Ben doc okumak ve biz başka yaklaşımından daha bu modülü bir daha kullanmak isteyeyim neden belli değil) – smci

cevap

30

Ben try except blok un-pythonic olduğunu düşünmüyorum ... Ben isimlerini değiştirmek istemiyordu eğer çok kolay olurdu; bunun yerine, Python'da içe aktarmayı işlemenin yaygın bir yoludur. Dive into Python aktaran

:

fiili hata koşullarını ele yanında istisnalar için diğer kullanımların bir yeri vardır

. standart Python kitaplığındaki yaygın bir kullanım, modülünü almak ve 'u çalışıp çalışmadığını kontrol etmektir. Mevcut olmayan bir modülünün içe aktarılması, bir ImportError istisnasını artıracaktır. çalışma zamanında, ya da ( platforma özel kodu farklı modüllere ayrılır) destek çoklu platformlar için kullanılabilir hangi modülleri için temel işlevsellik çok düzeyde tanımlamak için kullanabilir. Bir sonraki örnek, platformunun platformuna özgü işlevselliğini desteklemek için bir istisnayı nasıl kullanacağını gösterir.

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

kolay yolu tüm modüller tüm sistemlerde yüklenebilir sağlamaktır. Bu işe yaramazsa, bir try blokta her import deyimi çevreleyen sonraki en iyi çözüm ve hiç değil un-Pythonic olduğunu.

0

https://stackoverflow.com/a/20228312/1587329 savunduğu olarak

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 

named_libs tüm kütüphanelerin içe [değişik]. İlk dize kütüphane adı, ikincisi ise kestirme. isimsiz kütüphaneler için, the original kullanabilirsiniz:

"imp" modül size yardımcı olacaktır
libnames = ['numpy', 'scipy', 'operator'] 
for libname in libnames: 
    try: 
     lib = __import__(libname) 
    except: 
     print sys.exc_info() 
    else: 
     globals()[libname] = lib 
İlgili konular