Error handling when importing modules

后端 未结 3 1766
一个人的身影
一个人的身影 2020-12-09 14:37

This probably has an obvious answer, but I\'m a beginner. I\'ve got a \"module\" (really just a file with a bunch of functions I often use) at the beginning of which I impo

相关标签:
3条回答
  • 2020-12-09 15:12

    I don't think try except block is un-pythonic; instead it's a common way to handle import on Python.

    Quoting Dive into Python:

    There are a lot of other uses for exceptions besides handling actual error conditions. A common use in the standard Python library is to try to import a module, and then check whether it worked. Importing a module that does not exist will raise an ImportError exception. You can use this to define multiple levels of functionality based on which modules are available at run-time, or to support multiple platforms (where platform-specific code is separated into different modules).

    The next example demonstrates how to use an exception to support platform-specific functionality.

    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
    
    0 讨论(0)
  • 2020-12-09 15:20

    The easiest way is to ensure that all modules can be loaded on all systems. If that doesn't work, enclosing each import statement in a try block is the next best solution and not un-Pythonic at all.

    0 讨论(0)
  • 2020-12-09 15:26

    As advocated by https://stackoverflow.com/a/20228312/1587329 [modified, with an edit from @Ian]

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

    imports all libraries in named_libs. The first string is the library name, the second the shorthand. For unnamed libraries, you can use the original:

    from importlib import import_module     
    
    libnames = ['numpy', 'scipy', 'operator']
    for libname in libnames:
        try:
            lib = import_module(libname)
        except:
            print sys.exc_info()
        else:
            globals()[libname] = lib
    
    0 讨论(0)
提交回复
热议问题