【问题标题】:Automatically import files in python在python中自动导入文件
【发布时间】:2021-01-25 10:12:56
【问题描述】:

我正在开发一个有几个子模块的搅拌机插件

- A/__init__.py
  |
  |- B/__init__.py

在 A/init.py 我可以使用import A.B 来导入子模块 B 的内容,但我希望能够自动导入这些文件。有什么方法可以实现吗?

这个想法是我的插件用于实现几个 glTF 扩展。每个扩展都在自己的子模块中,glTF 导出器希望我返回一些类,每个扩展一个。

我不想手动导入每个扩展并将类添加到扩展列表中,而是希望自动发生

而不是

from A.B import B_extension

glTF2ExportUserExtensions = [A.B.B_extension]

我想要类似的东西

# A.submodules returns all the submodules and extension() returns the extension class. Im assuming each submodule have an extension() function
glTF2ExportUserExtensions = [A.submodules.extension()]

我需要返回一个类列表

【问题讨论】:

  • 自动是什么意思?
  • 我不必这样做import A.B,但是当我在搅拌机中激活插件时它会自动导入。
  • 那么您应该提供有关模块结构的更多信息或阅读有关该主题的一些教程。 F.I. init.py 应改为 __init__.py。同样不清楚A 是模块还是子模块的一部分。有没有更高层次的模块? 您想在哪里 导入子模块? 自动是什么意思? Python 无法猜测您要导入什么,您必须至少在一处指定导入。那么什么是自动的呢?
  • 你是对的,文件是__init__.py,这是一个错字。我对问题进行了一些编辑。 Blender 正在导入一个模块。现在我希望 A 能够导入 B,它是 A 的子目录,其中包含另一个 __init__.py 文件。我正在考虑以某种方式迭代 A 的子目录

标签: python blender


【解决方案1】:

您可以从具有导入功能的基本文件中导入内容。

./import_file.py 的示例

import example
import ...

您可以使用“*”从导入文件中导入所有内容,也可以导入特定的内容。

./main_file.py 的示例

from import_file import *
from import_file import example

【讨论】:

  • 如果不是紧急需要,不要做加星标的导入!
【解决方案2】:

好的,我想我明白你想要做什么了。

所以要在同一个“子模块名称”submodules 下导入多个子模块,请将它们导入与A/__init__.py 相同级别的单独文件submodules.py

from .B import B_extension as extension
from .C import C_extension as someothername

并在A/__init__.py 中添加:

from . import submodules

现在如果你用

导入A
import A

您可以使用A.submodules.extensionA.submodules.someothername 等访问子模块...

如果你想访问子模块函数/类/等。直接来自子模块,例如A.submodules.extension(),您的submodules.py 文件必须如下所示:

from .B.B_extension import extension, anotherBmethod, SomeBClass
from .C.C_extension import Cextension, anotherCmethod, SomeCClass

如果您想进行全自动导入,请使用pkgutil(感谢this answer),尽管我强烈反对自动导入所有子模块。 显式比隐式好。你永远不知道当你改变一个子模块中的一行时会发生什么,如果不测试 all 在隐式执行时导入...将这个添加到@ 987654336@:

import pkgutil

__all__ = []
for loader, module_name, is_pkg in  pkgutil.walk_packages(__path__):
    __all__.append(module_name)
    _module = loader.find_module(module_name).load_module(module_name)
    globals()[module_name] = _module

【讨论】:

  • 嗯,这不是自动的。我必须创建一个包含所有导入的子模块文件。我不能让 python 查看当前文件的子目录 (A/__init__.py) 并自动调用与模式匹配的文件的函数 (A/B/__init__.py)
  • 我肯定会避免这种情况。当你做这样的事情时,如果你改变一行,你永远不知道会发生什么。看看import this的第二行
猜你喜欢
  • 2020-02-05
  • 2012-09-15
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
相关资源
最近更新 更多