【问题标题】:name ' ' is not defined名称“ ”未定义
【发布时间】:2018-06-21 15:51:01
【问题描述】:

我有一个存储在内置函数中的函数。这用于从项目基目录加载具有相对路径的 python 模块。 projecs基目录存放在builtins.absolute下

函数如下:

def projectRelativeImport(fileName, projectRelativePath, moduleName = None):
    # if moduleName not set, set it to file name with first letter capatilised
    if moduleName is None:
        moduleName = fileName[:1].capitalize() + fileName[1:]

    # we shouldn't be passing fileName with an extension unless moduleName is set due to previous if. So in those cases we add .py
    if len(fileName) >= 3 and fileName[-3:] != '.py':
        fileName = fileName + '.py'

    dir = os.path.join(builtins.absolute, projectRelativePath)
    full = os.path.join(dir, fileName)

    sys.path.append(dir)
    imp.load_source(moduleName, full)
    sys.path.remove(dir)

在我的其他文件之一中,我使用projectRelativeImport('inputSaveHandler', 'app/util', 'SaveHandler') 从 app/util/inputSaveHandler.py 导入 SaveHandler。这贯穿项目RelativeImport 绝对没问题。小鬼正在使用正确的字符串,我已经打印出来检查了。

但是在那次执行之后的几行我有一行

handler = SaveHandler.ConfHandler()

抛出NameError: name 'SaveHandler' is not defined


我意识到我的项目相对导入函数有点奇怪,特别是因为我使用内置函数将它全局保存(可能有更好的方法,但我最近两天才开始使用 python)。但我只是有点困惑为什么这个名字没有被识别。由于项目相对导入功能在不同的文件中,所以我是否需要从 imp 中返回一些内容?

【问题讨论】:

  • 你在builtins中放了一个函数?!我不认为我会建议这样做。
  • 是的,但我希望它可以在任何导入文件的顶部立即访问。如果有另一种方式那就太好了。最终我希望它的工作方式类似于其他语言中的命名空间
  • @Shard 好吧,说到其他语言,即使在 C++ 中,通过头文件中的 using ...{} 处理命名空间也是一件坏事(这是你在 C/C++ 中“导入”的东西)。类似地,在 Python 中,您将函数放入模块中并导入它们/从它们中导入。
  • python 中的导入不会交给父母。或者兄弟姐妹。这就是为什么我的方法解决了这个问题,但它不能解决导入自身的问题,所以才会这样。目前有一个launcher.py,有app目录、storage目录、settings目录。在 app 中有一个 main.py、modules 目录和 util 目录,这两个目录又包含更多文件。当我的一个模块文件需要从 util 访问帮助程序时,他们需要这个函数

标签: python python-3.x


【解决方案1】:

我通过从 projectRelativeImport() 返回从 imp.load_source 传回的内容来解决此问题,如下所示:

sys.path.append(dir)
submodule = imp.load_source(moduleName, full)
sys.path.remove(dir)
return submodule

然后当我使用导入函数时,返回值现在转到一个与我给模块同名的变量(都很奇怪)

SaveHandler = projectRelativeImport('inputSaveHandler', 'app/util', 'SaveHandler')

我之所以这样做,是因为它在 projectRelativeImport 定义的文件中没有问题,但在其他任何文件中都没有。所以这对我来说显然是一个范围问题,所以我想我会尝试返回任何 imp 给我的东西并且它有效

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 2018-01-24
    • 2018-02-21
    • 2020-07-31
    • 2018-07-07
    • 2021-11-26
    相关资源
    最近更新 更多