代码之家  ›  专栏  ›  技术社区  ›  Shardj

未定义名称“”。

  •  0
  • Shardj  · 技术社区  · 6 年前

    我有一个内置函数。这用于从项目基目录加载具有相对路径的Python模块。项目基目录存储在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/inputsavehander.py导入savehandler。这是贯穿整个项目的RelativeImport非常好。正确的字符串正在被IMP使用,我已经打印出来检查。

    但在那次处决之后我有几句台词

    handler = SaveHandler.ConfHandler()
    

    哪个投掷 NameError: name 'SaveHandler' is not defined


    我意识到我的项目相对导入功能有点奇怪,特别是因为我使用内置的全局保存了它(可能有更好的方法,但我在过去两天才开始使用python)。但我只是有点困惑为什么这个名字不被认可。由于项目的相对导入功能位于不同的文件中,因此范围是垃圾,是否需要从IMP返回某些内容?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Shardj    6 年前

    我通过从projectrelativeimport()返回从imp.load_源返回的内容来修复此问题,如下所示:

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

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

    我之所以这样做,是因为文件projectrelativeimport在中定义,但在任何其他文件中都没有问题。所以这对我来说显然是一个范围问题,所以我想我只要把IMP给我的东西还给他就行了。