子模块上的ModuleNotFoundError

时间:2019-03-27 15:50:25

标签: python python-import

我意识到这样的问题已经被问了无数次,但是我无法弄清楚如何成功导入我的data子模块。

MCVE

目录结构

┌ dummy
├── setup.py
└─┬ dummy
  ├── __init__.py
  ├── foo.py
  └─┬ data
    ├── __init__.py
    └── data_bar.py

我的顶级__init__.py包含

from .foo import *
from .data import *

并且data/__init__.py为空。


重新创建问题

我将软件包安装到新的虚拟环境中

pip install /path/to/dummy

效果很好。然后在一个ipython shell 从完全目录运行中,我尝试导入该软件包

H:\Desktop$ ipython
In [1]: import dummy
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-1-cfc16ef2ccc8> in <module>
----> 1 import dummy

C:\Users\rlane\AppData\Local\Continuum\miniconda3\envs\secdetect_test\lib\site-packages\dummy\__init__.py in <module>
      1 from .foo import *
----> 2 from .data import *

ModuleNotFoundError: No module named 'dummy.data'

foo.py导入没有错误,但是在尝试了from .data import *的所有可能变体之后,我无法在data子模块中加载代码。


我尝试过的事情

顶级__init__.py内的变化

from .data import *
from data import *
from . import data
from .data import data_bar
from .data.data_bar import *

所有这些都导致相同的ModuleNotFoundError

2 个答案:

答案 0 :(得分:1)

问题是dummy.data脚本中缺少setup.py作为软件包。

setup(
    name=DISTNAME,
    author=MAINTAINER,
    ...
    packages=[
        'dummy',
        'dummy.data'
    ],
    ...
    long_description=open('README.md').read(),
)

使用此配置,顶层from .data import *中的from . import data__init__.py都可以工作。

答案 1 :(得分:0)

我也尝试过,但是对我有用。

这是我的结构(请注意,所有这些文件都位于一个名为 dummy 的文件夹中)。

enter image description here

Python文件:

foo.py:

def foo_module():
    return 'foo module'

data_bar.py:

def data_bar_module():
    return 'Data bar'

test.py:

import dummy
#from dummy.data import data_bar

#print(dummy.foo.foo_module())
#print(data_bar.data_bar_module())

当我执行python3 test.py时,它不会给我任何错误,而当我取消注释test.py文件中的注释行时,它会给出:

foo module
Data bar

我不确定它为什么能工作,但是尝试像这样导入数据包,它可能会工作。

from dummy.data import *

希望这会有所帮助。