子模块上的 ModuleNotFoundError

ModuleNotFoundError on submodule

我意识到像这样的问题已经被问过成千上万次,但我不知道如何成功导入我的 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 安装包到一个新的虚拟环境

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

我也试过,但对我有用。

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

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 *

希望这对您有所帮助。

问题是 dummy.data 作为包在 setup.py 脚本中丢失。

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

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