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''