我有一个内置在内置函数中的函数。这用于从项目基本目录加载具有相对路径的python模块。项目的基本目录存储在buildins.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中运行都很好。 imp已使用正确的字符串,我已打印进行检查。
但是在执行之后几行,我有一行
handler = SaveHandler.ConfHandler()
哪个抛出NameError: name 'SaveHandler' is not defined
我意识到我的项目相对导入功能有点奇怪,尤其是因为我使用内置函数将其全局保存(可能是一种更好的方法,但最近两天才开始使用python)。但是我对为什么不认识这个名字有点困惑。由于项目相对导入功能位于不同的文件中,我是否需要从imp返回一些内容,因为作用域是垃圾?
答案 0 :(得分:0)
我通过从projectRelativeImport()返回从imp.load_source返回的内容来解决此问题,如下所示:
sys.path.append(dir)
submodule = imp.load_source(moduleName, full)
sys.path.remove(dir)
return submodule
然后,当我使用import函数时,返回的值现在转到一个变量,该变量的名称与我给模块使用的名称相同(都很奇怪)
SaveHandler = projectRelativeImport('inputSaveHandler', 'app/util', 'SaveHandler')
我之所以这样做,是因为在projectRelativeImport文件中定义的文件没有问题,但没有其他任何定义。因此,这显然对我来说是一个范围问题,所以我认为我会尝试退回给我带来的印象,