【发布时间】:2011-01-13 23:32:23
【问题描述】:
注意:已解决。原来我正在导入同一模块的以前版本。
在 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 上运行脚本也遇到同样的错误,使用 IronPython 2.6 for .NET 4.0
谢谢。
如果您认为有其他详细信息有助于解决此问题,我很乐意提供。
根据要求,这是 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__': 之外定义的。
【问题讨论】:
-
请发布您收到的确切错误消息。
-
你能获得 InfraPy 模块的源代码吗?但我的第一个猜测是,也许你在 bloc
if __name__=='__main__':中定义了函数 listToText 有吗?` -
我建议您在模块中发布函数和/或类的定义(即,'def' 或 'class' 行,但没有主体),至少显示一个可以从在模块之外,一个不在模块之外。
-
你能显示
import InfraPy; print InfraPy.__dict__的输出吗? -
谢谢大家。我已尝试回应您的请求。对于 ChristopheD,
print InfraPy.__dict__显示了除 listToText 之外的所有内容。