【问题标题】:NameError: global name 'PermissionError' is not defined (python 2.x)NameError:未定义全局名称“PermissionError”(python 2.x)
【发布时间】:2013-08-14 12:02:21
【问题描述】:

下面一行:

except (IOError, PermissionError, FileNotFoundError) as e:

当我使用 python 2.75 运行它时给出以下错误消息:

NameError: global name 'PermissionError' is not defined

但是使用 python 3.3 一切运行良好。

想法/建议?

【问题讨论】:

    标签: python-3.x permissions python-2.x nameerror


    【解决方案1】:

    在 Python 2.7 中没有 PermissionError,它是在 Python 3.3 流中以 PEP 3151 引入的。有关 2.7 例外的列表,请参阅here

    PEP 3151 试图清理 OS 和 I/O 相关异常的异常层次结构。

    我相信,在此之前,相当于捕获 OSError 并检查 errno 以获得 EPERM,或检查 IOError 并检查 errno 以获得 EACCES

    您始终可以检查您是否在 Python 3.3 或更高版本下运行,如果不是,则创建您自己的 PermissionError。当然,这永远不会抛出,因此您还需要抓住上面显示的两种可能性。

    【讨论】:

    • 我需要此代码在 Win 和 Unix 上同时在 2.7 和 3.3 中工作。关于如何使代码兼容两者的任何想法?例如:
      try: input = raw_input
      除了 NameError: pass
    • 我稍微摆弄了一下,当我将 except 行更改为 'except (IOError, OSError) as e:' 时,它在两个 python 版本中都可以正常工作。必须在 except 处理中做我自己的层次结构,所以它会在两个 python 版本上显示相同的消息——如果你有关于如何以另一种方式实现它的想法(即如何做你的第二个建议)我真的很感激代码示例。
    • @ofer,最好把它留给比我想得更多的人:看看python3porting.com/toc.html。那里有很多关于使用sys.version 进行检测的内容,即使您不想使用该文档中支持的工具。
    【解决方案2】:

    这为我解决了 python 2.75 和 3.31 的问题:

    from errno import EACCES, EPERM, ENOENT
    
    def print_error_message(e, file_name):
        #PermissionError
        if e.errno==EPERM or e.errno==EACCES:
            print("PermissionError error({0}): {1} for:\n{2}".format(e.errno, e.strerror, file_name))
        #FileNotFoundError
        elif e.errno==ENOENT:
            print("FileNotFoundError error({0}): {1} as:\n{2}".format(e.errno, e.strerror, file_name))
        elif IOError:
            print("I/O error({0}): {1} as:\n{2}".format(e.errno, e.strerror, file_name))
        elif OSError:
            print("OS error({0}): {1} as:\n{2}".format(e.errno, e.strerror, file_name))
    
    try:
    ...
    except (IOError, OSError) as e:
        print_error_message(e,full_name)
        sys.exit()
    except:
        print('Unexpected error:', sys.exc_info()[0])
        sys.exit()
    

    欢迎提出想法/cmets/建议。

    【讨论】:

      猜你喜欢
      • 2013-08-23
      • 1970-01-01
      • 2013-07-20
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      相关资源
      最近更新 更多