注意:已解决。原来,我正在导入同一模块的先前版本。

在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,在Windows 7上运行脚本时也遇到了相同的错误,对于.NET 4.0使用IronPython 2.6

谢谢。

如果您认为还有其他细节可以帮助解决此问题,我们将很乐意为您提供这些细节。

根据要求,这是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__':之外定义。

最佳答案

如果模块定义了 __all__ ,则可能会发生这种情况

或者,您的路径中可能有另一个版本的模块正在导入,而不是您期望的版本
NameError是关于listToText的问题还是函数内部的某种原因导致了异常?

09-25 20:40