是否有可能导入子模块的特定方式?
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
相同,除了向上一步。
我在以下目录树中工作:
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
相同,除了向上一步。