我是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。 提前谢谢!
答案 0 :(得分: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)
答案 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)