python NameError:name'<anything>'未定义(但它是!)</anything>

时间:2011-01-13 23:32:24

标签: python nameerror

注意:已解决。事实证明我正在导入同一模块的先前版本。

在StackOverflow上很容易找到类似的主题,其中有人遇到了NameError。但大多数问题涉及特定模块,解决方案通常是更新模块。

就我而言,我试图从我自己编写的模块中导入一个函数。该模块名为InfraPy,它肯定在sys.path上。 InfraPy中的一个特定函数(称为listToText)返回一个NameError,但仅当我尝试将其导入另一个脚本时。在InfraPy内部,if __name__=='__main__':下,listToText函数运行正常。从InfraPy我可以毫无问题地导入其他功能。在我尝试使用listToText函数之前,在我的脚本中包含from InfraPy import *不会返回任何错误。

怎么会发生这种情况?
如何导入一个特定函数返回一个NameError,而导入同一模块中的所有其他函数工作正常?

在MacOSX 10.6上使用python 2.6,在使用IronPython 2.6 for .NET 4.0时在Windows 7上运行脚本也遇到了同样的错误

感谢。

如果您认为其他细节有助于解决此问题,我很乐意为您提供。

根据要求,这里是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 个答案:

答案 0 :(得分:4)

如果模块已定义__all__

,则可能发生这种情况

或者,您的路径中可能有另一个版本的模块正在导入而不是您期望的模块

NameError是关于listToText还是导致异常的函数?

答案 1 :(得分:3)

此外,__all__变量gnibbler提到你也可能遇到一个位于某处的InfraPy.pyc文件的问题。

我建议先在InfraPy.py文件中放置一个import pdb;pdb.set_trace(),以确保您在正确的文件中,然后逐步完成InfraPy.py的定义,看看发生了什么。如果没有断点,则导入的文件超出您的想象。

导入后您还可以dir(InfraPy),并使用InfraPy.__file__检查您实际导入的文件。

现在无法想到任何更多的导入调试提示。 ; - )