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
Mypwd
是顶级目录,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中putfrom。导入顶部的编码器
,这应该可以工作编码器
必须在模块/\uuu init\uuuuuuuuuuy.py
中提供,您可能希望从中获得类似的内容。导入编码器。rnn_编码器
inthere@GreenCloakGuy令人惊叹的!如果你写它作为一个答案,我会把它标记为选中!令人惊叹的!谢谢
from . import rnn_encoder
from . import encoders