Python'将X导入为Y'导致'NameError全局名称'Y'未定义

时间:2013-10-29 21:38:56

标签: python windows python-import winreg

我是python的新手,并试图从下面的代码中解决这个错误:

try:
    import _winreg as winreg
except ImportError:
    pass

...

path = 'HARDWARE\\DEVICEMAP\\SERIALCOMM'
        try:
                 key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path)
        except WindowsError, e:
                if e.errno == 2:
                        return []
                else:
                        raise e

输出:未定义NameError全局名称'winreg'。

我错过了什么让这个工作?我的猜测是他们包含'import as',因为_winreg在python 3+中只是winreg。我试过简单地导入为_winreg并替换winreg - > _winreg但是它也返回一个未定义'_winreg'的NameError。 提前谢谢!

2 个答案:

答案 0 :(得分:3)

你正在沉默ImportError

try:
    import _winreg as winreg
except ImportError:
    pass

winreg很可能无法在此处导入,因此NameErrorwinreg名称从未分配,因为导入失败。

您可以移除try / except块以确认发生了什么。


由于您希望支持Python 3,您最有可能寻找的是:

try:
    import _winreg as winreg  # Try importing on Python 2
except ImportError:
    import winreg  # Fallback to Python 3 (if this raises an Exception, it'll escalate)

(_winreg was renamed in Python 3)

答案 1 :(得分:0)

你的代码适用于python 2.x但在python 3.x上无声地失败。正确的做法是尝试3.x导入,如果失败则回退到2.x导入。由于第二次导入不受try / except块的保护,如果winreg在任何一种形式中都不存在,它将失败 - 例如,如果它在linux机器上运行。

try:
    # try python3 import
    import winreg
except ImportError:
    # fall back to python2 import
    import _winreg as winreg
# test code proves it works
print(winreg)