0

我是 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 但这也返回一个 NameError 未定义 '_winreg'。提前致谢!

4

2 回答 2

3

你正在使ImportError.

try:
    import _winreg as winreg
except ImportError:
    pass

winreg很可能不会在此处导入,因此NameError:winreg由于导入失败,因此从未分配名称。

您可以删除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在 Python 3 中重命名)

于 2013-10-29T21:43:54.833 回答
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)
于 2013-10-29T21:57:32.567 回答