【发布时间】: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