Python 导入子模块的具体方式是否可行?

Python 导入子模块的具体方式是否可行?,python,import,module,python-import,python-module,Python,Import,Module,Python Import,Python Module,我正在以下目录树中工作: src/ __init__.py train.py modules/ __init__.py encoders/ __init__.py rnn_encoder.py Mypwd是顶级目录,My\uuuuu init\uuuuuuuuy.py文件都是空的。我正在执行train.py,其中包含以下代码段 import modules # RNNEncoder is

我正在以下目录树中工作:

src/
    __init__.py
    train.py
    modules/
        __init__.py
        encoders/
            __init__.py
            rnn_encoder.py
My
pwd
是顶级目录,My
\uuuuu init\uuuuuuuuy.py
文件都是空的。我正在执行
train.py
,其中包含以下代码段

import modules

# RNNEncoder is a class in rnn_encoder.py
encoder = modules.encoders.rnn_encoder.RNNEncoder(**params)
当我执行
train.py
时,我得到一个错误

AttributeError:模块“modules”没有属性“encoders”


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

\uuuu init\uuuuuuuuuuuupy
文件放在一个文件夹中,允许该文件夹作为导入目标,即使它是空的。按照您当前的设置方式,以下各项应能正常工作:

from modules.encoders import rnn_encoder
encoder = rnn_encoder.RNNEncoder(**params)
在这里,python将
modules.encoders
本质上视为一个文件路径,然后尝试实际导入
rnn\u encoder
中的代码

但是,这是行不通的:

import modules
encoder = modules.encoders.rnn_encoder.RNNEncoder(**params)
原因是,当您执行
导入模块
时,python在幕后所做的是从
模块
文件夹导入
\uuuu init\uuuuuy.py
,而不是别的。它没有遇到错误,因为
\uuuu init\uuuu.py
存在,但因为它是空的,所以实际上什么都不做

您可以将代码放入
\uuuu init\uuuu.py
中,以填充模块的名称空间,并允许用户从模块外部访问该名称空间。要解决您的问题,请进行以下更改:

modules/encoders/\uuuuuu init\uuuuuuuuu.py

modules/\uuuuu init\uuuuuu.py


这将导入
rnn\u编码器
,并将其分配给
编码器
的命名空间,允许您导入
编码器
,然后访问
编码器.rnn\u编码器
。与
模块.encoder
相同,只是向上一步。

是否允许修改
\uuuuu init\uuuuuuuuuuy.py
文件?如果是这样:在
编码器/_uinit_uuuu.py中
放入来自的行。在顶部导入rnn_编码器,并在模块/_uinit_uuuuy.py中put
from。导入顶部的编码器
,这应该可以工作
编码器
必须在
模块/\uuu init\uuuuuuuuuuy.py
中提供,您可能希望从中获得类似
的内容。导入编码器。rnn_编码器
inthere@GreenCloakGuy令人惊叹的!如果你写它作为一个答案,我会把它标记为选中!令人惊叹的!谢谢
from . import rnn_encoder
from . import encoders