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

俄瑞斯忒斯·谢里亚

我在以下目录树中工作:

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)

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

但是,这行不通:

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

原因是,当你这样做时import modules,python 在幕后所做的是__init__.pymodules文件夹中导入,没有别的。它不会遇到错误,因为__init__.py exists,但由于它是空的,它实际上并没有任何事情。

您可以放入代码__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,除了向上一步。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章