对__init__.py和导入感到困惑

时间:2018-10-13 05:43:00

标签: python

所以我有一个像这样的目录设置:

some_dir/
  foo/
    bar/
      test.py
  src/
    __init__.py
    data/
      __init__.py
      utils.py

我想从我的test.py模块中导入utils.py

import sys.path
sys.path.append("../../")
from src import data
data.utils // this throws an error AttributeError: module 'src.data' has no attribute 'utils'

但是当我这样做时:

import sys.path
sys.path.append("../../")
from src.data import utils 

一切正常,这为什么呢?

1 个答案:

答案 0 :(得分:1)

a)from src.data import utils将导入utils.py,所以一切正常。

b)from src import data只会导入data package,从不导入utils.py,如果需要,您需要在__init__.py的文件夹{{1}下添加显式导入},如下所示:

1)如果需要同时支持python3和python2:

__ init __。py:

data

或者:

__ init __。py:

import src.data.utils # absolute import

2)如果仅需要支持python2,请使其简单:

__ init __。py:

from . import utils # relative import

然后,在导入软件包时,该软件包下的import utils 也将被执行。