是否有可能导入子模块的特定方式?

Is specific way of importing submodules at all possible?

我在以下目录树中工作:

src/
    __init__.py
    train.py
    modules/
        __init__.py
        encoders/
            __init__.py
            rnn_encoder.py

我的pwd是顶级目录,我的__init__.py文件都是空的。我正在执行 train.py,其中包含以下代码片段。

import modules

# RNNEncoder is a class in rnn_encoder.py
encoder = modules.encoders.rnn_encoder.RNNEncoder(**params)

当我执行 train.py 时,我得到一个错误提示

AttributeError: module 'modules' has no attribute 'encoders'

我想知道是否有任何 干净 方法来完成这项工作。请注意,我不是在寻找其他导入方法,我很清楚这可以通过其他方式完成。我想知道的是,是否可以在保持给定目录结构的同时将代码保持在 train.py 中。

__init__.py 文件放入文件夹允许该文件夹充当导入目标,即使它是空的。按照您目前的设置方式,以下应该有效:

from modules.encoders import rnn_encoder
encoder = rnn_encoder.RNNEncoder(**params)

这里,python 本质上将 modules.encoders 视为文件路径,然后尝试实际导入 rnn_encoder.

中的代码

但是,这行不通:

import modules
encoder = modules.encoders.rnn_encoder.RNNEncoder(**params)

原因是,当您执行 import modules 时,python 在幕后所做的是从 modules 文件夹中导入 __init__.py,除此之外别无其他。它不会 运行 出错,因为 __init__.py 存在 ,但因为它是空的,所以它实际上不会 do 很多东西。

您可以将代码放入 __init__.py 以填充模块的命名空间,并允许人们从模块外部访问该命名空间。要解决您的问题,请进行以下更改:

modules/encoders/__init__.py

from . import rnn_encoder

modules/__init__.py

from . import encoders

这会导入 rnn_encoder 并将其分配给 encoders 的命名空间,允许您导入 encoders 然后访问 encoders.rnn_encoder。与 modules.encoders 相同,除了向上一步。