【问题标题】:How do I import something from a nested child directory with Python?如何使用 Python 从嵌套的子目录中导入某些内容?
【发布时间】:2020-04-05 15:07:37
【问题描述】:

在我的主文件(根级别)中,我有:

from deepspeech2_utils import reduce_tensor, check_loss

我还有一个__init__.py,它有:

from submodules.deepspeech2 import utils as deepspeech2_utils

我的目录结构如下:

main.py
__init__.py
-submodules
  -deepspeech2
    -utils.py

但我得到一个错误:

    from deepspeech2_utils import reduce_tensor, check_loss
ImportError: No module named deepspeech2_utils

我也试过了:

from submodules.deepspeech2.utils import reduce_tensor, check_loss

但得到同样的错误。

我做错了什么?

【问题讨论】:

  • deepspeech2submodules
  • 如果你的广告是空白的__init__.pydeepspeech2?如果没有,也会尝试将 init 添加到子模型中
  • 正如你所说的你的目录结构from submodules.deepspeech2.utils import reduce_tensor, check_loss这个代码可以工作
  • @Shamoon 您使用哪个版本的 Python? Namespace packages 在 3.3 版中引入,因此您的代码应该可以正常工作:from submodules.deepspeech2.utils import ...
  • 您收到的信息一模一样?也许你在from submodules.deepspeech2.utils import reduce_tensor, check_loss中有错字

标签: python


【解决方案1】:

因此,python 中将目录识别为模块的方式是在这些目录中存在__init__.py 文件。这些__init__.py 文件不需要有代码。因此,将您的目录结构更改为如下所示

root
    main.py
    __init__.py
    submodules
        __init__.py
        deepspeech2
            __init__.py
            utils.py

现在一旦完成,您的导入语句 __init__.py 中的(如果没有上述目录更改,则无法使用)有一个范围,它在您的 main.py 中不可见-具有不同的范围。为了实现你正在做的事情,将 main.py 中的 import 语句更改为

from root.deepspeech2_utils import reduce_tensor, check_loss

除了命名空间的原因,我必须建议,不鼓励在 __init__.py 中导入,因为您模块的用户可能只想从您的模块/子模块中导入特定的东西,而您在 __init__.py 中的导入语句将迫使他们有比他们想要的更多的进口。 Here is an answer 来自另一篇详细讨论此类问题的帖子

【讨论】:

    【解决方案2】:

    您需要放入所有子文件夹 init.py 以转换模块上的此文件夹并导入此文件夹。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 2021-11-01
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多