我在以下目录树中工作:
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__.py
从modules
文件夹中导入,没有别的。它不会遇到错误,因为__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] 删除。
我来说两句