python NameError: 名称 '<anything>' 未定义(但实际上是!)
注意:问题已解决。原来我导入的是同一个模块的旧版本。
在StackOverflow上,类似的主题很常见,很多人遇到了NameError(名称错误)。不过大多数问题都是针对特定模块的,解决办法通常是更新模块。
在我的情况下,我想从我自己写的一个模块中导入一个函数。这个模块叫InfraPy,肯定在sys.path中。InfraPy中的一个特定函数(叫listToText)在我尝试将它导入到另一个脚本时返回了NameError,但在InfraPy内部,if __name__=='__main__':
下,listToText函数运行得很好。我可以毫无问题地从InfraPy导入其他函数。在我的脚本中包含from InfraPy import *
不会返回任何错误,直到我尝试使用listToText函数。
这怎么会发生呢?
为什么导入一个特定的函数会返回NameError,而导入同一个模块中的其他函数却没有问题呢?
我在MacOSX 10.6上使用Python 2.6时遇到了同样的错误,在Windows 7上运行脚本时也遇到了这个问题,使用的是IronPython 2.6 for .NET 4.0。
谢谢。
如果你觉得还有其他细节能帮助解决这个问题,我很乐意提供。
按照要求,这里是InfraPy中的函数定义:
def listToText(inputList, folder=None, outputName='list.txt'):
'''
Creates a text file from a list (with each list item on a separate line). May be placed in any given folder, but will otherwise be created in the working directory of the python interpreter.
'''
fname = outputName
if folder != None:
fname = folder+'/'+fname
f = open(fname, 'w')
for file in inputList:
f.write(file+'\n')
f.close()
这个函数是在if __name__=='__main__':
上面和外面定义的。
我尝试过在脚本的相关位置移动InfraPy。最让人困惑的情况是,当InfraPy和脚本在同一个文件夹时,我使用from InfraPy import listToText
导入时,收到这个错误:NameError: name listToText is not defined
。再次强调,其他函数导入都没问题,它们都是在InfraPy的if __name__=='__main__':
外面定义的。
2 个回答
另外,gnibbler提到的__all__
变量,你可能还会遇到一个问题,就是有一个InfraPy.pyc文件不知道藏在哪儿了。
我建议你在InfraPy.py文件的开头加上import pdb;pdb.set_trace()
,这样可以确保你在正确的文件里,然后一步一步查看InfraPy.py的定义,看看发生了什么。如果没有停下来,你可能导入了一个你想象中不同的文件。
你还可以在导入InfraPy之后使用dir(InfraPy)
,然后用InfraPy.__file__
来检查你实际上导入的是哪个文件。
现在想不出更多关于导入调试的建议了。;-)
如果这个模块定义了 __all__
,就可能会出现这种情况。
另外,你的路径中可能有另一个版本的这个模块被导入了,而不是你期待的那个版本。
这个 NameError
是关于 listToText
的,还是说是函数内部的某个地方引发了这个错误?