注意:已解决。原来,我正在导入同一模块的先前版本。
在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
的问题还是函数内部的某种原因导致了异常?