【问题标题】:python NameError: name '<anything>' is not defined (but it is!)python NameError: name '<anything>' 未定义(但它是!)
【发布时间】: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 之外的所有内容。

标签: python nameerror


【解决方案1】:

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

或者,您的路径中可能有另一个版本的模块被导入,而不是您期望的那个

NameError 是关于 listToText 还是函数内部的某些东西导致了异常?

【讨论】:

  • 感谢 gnibbler,它似乎是 sys.path 上模块的另一个版本。当我使用 InfraPy 和测试脚本创建一个新文件夹并从我的站点包目录中删除一些 .pth 文件时,它工作正常。当我从该新文件夹中删除 InfraPy 并恢复 .pth 文件时,我收到了与启动此帖子相同的错误。找到并解决。谢谢!
【解决方案2】:

此外,__all__ 变量 gnibbler 提到您也可能在某处放置 InfraPy.pyc 文件时遇到问题。

我建议将import pdb;pdb.set_trace() 首先放在 InfraPy.py 文件中,以确保您在正确的文件中,然后逐步检查 InfraPy.py 的定义以查看发生了什么。如果您没有得到断点,那么您正在导入另一个文件,而不是您想象的。

你也可以在导入后dir(InfraPy),用InfraPy.__file__查看你实际导入的是哪个文件。

现在想不出更多的导入调试提示。 ;-)

【讨论】:

  • 感谢 Lennart,InfraPy.__file__ 提示在这种情况下特别有用。我为 InfraPy.pyc 做了一些钓鱼,发现了一个可能导致问题的地方。
猜你喜欢
  • 2023-01-30
  • 2022-11-21
  • 2022-09-23
  • 2022-11-25
  • 2016-05-24
  • 1970-01-01
  • 2023-01-17
  • 2020-11-15
  • 1970-01-01
相关资源
最近更新 更多