注意:已解决。事实证明我正在导入同一模块的先前版本。
在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__':
之外定义。
答案 0 :(得分:4)
答案 1 :(得分:3)
此外,__all__
变量gnibbler提到你也可能遇到一个位于某处的InfraPy.pyc文件的问题。
我建议先在InfraPy.py文件中放置一个import pdb;pdb.set_trace()
,以确保您在正确的文件中,然后逐步完成InfraPy.py的定义,看看发生了什么。如果没有断点,则导入的文件超出您的想象。
导入后您还可以dir(InfraPy)
,并使用InfraPy.__file__
检查您实际导入的文件。
现在无法想到任何更多的导入调试提示。 ; - )