注意:已解决。原来我正在导入同一模块的以前版本。
在StackOverflow上很容易找到类似的主题,其中有人遇到了NameError。但大多数问题都涉及到特定的模块,解决方案往往是更新模块。
在我的例子中,我试图从我自己编写的模块中导入一个函数。模块名为InfraPy,它肯定位于sys.path上。InfraPy中的一个特定函数(称为listtoext)返回一个NameError,但仅当我试图将其导入到另一个脚本时。在InfraPy中,在if __name__=='__main__':下,listToText函数工作正常。从InfraPy中,我可以毫无问题地导入其他函数。在我的脚本中包含from InfraPy import *不会返回任何错误,除非我尝试使用listToText函数。
这怎么可能发生?
在导入同一模块中的所有其他函数时,如何导入一个特定函数返回NameError?
在MacOSX10.6上使用Python2.6,在Windows7上运行脚本时也遇到同样的错误,在.NET4.0上使用IronPython2.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。同样,其他函数也可以导入fine,它们都是在InfraPy中的if __name__=='__main__':之外定义的。