NameError:未定义全局名称“PermissionError”(python 2.x)

Posted

技术标签:

【中文标题】NameError:未定义全局名称“PermissionError”(python 2.x)【英文标题】:NameError: global name 'PermissionError' is not defined (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 一切运行良好。

想法/建议?

【问题讨论】:

【参考方案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:\n2".format(e.errno, e.strerror, file_name))
    #FileNotFoundError
    elif e.errno==ENOENT:
        print("FileNotFoundError error(0): 1 as:\n2".format(e.errno, e.strerror, file_name))
    elif IOError:
        print("I/O error(0): 1 as:\n2".format(e.errno, e.strerror, file_name))
    elif OSError:
        print("OS error(0): 1 as:\n2".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/建议。

【讨论】:

以上是关于NameError:未定义全局名称“PermissionError”(python 2.x)的主要内容,如果未能解决你的问题,请参考以下文章

熊猫不进口吗? 'NameError:未定义全局名称'pandas''

NameError:未定义全局名称“QColor”

NameError:未定义全局名称“lower”

NameError:未定义全局名称

DD.close() NameError: 全局名称 'DD' 未定义

NameError:未定义全局名称“myLogFile”