导入后找不到模块

时间:2018-11-09 01:46:06

标签: python python-3.x flask python-module

我正在运行Python 3.6.3,并且在我尝试通过pip安装的子目录中有以下模块。

/g_plotter
          setup.py
          /g_plotter
                    __init__.py
                    g_plotter.py
                    Gparser.py

setup.py

from setuptools import setup

setup(
    name='g_plotter',
    packages=['g_plotter'],
    include_package_data=True,
    install_requires=[
        'flask',
    ],
)

我在容器中安装了来自Docker的模块:

RUN pip3 install ./g_plotter

然后在我的应用代码中:

import g_plotter

print(dir(g_plotter))

输出

 server_1  | ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

因此请使用此导入:

from  g_plotter import g_plotter

产生

server_1  | Traceback (most recent call last):
server_1  |   File "./g_server.py", line 21, in <module>
server_1  |     from  g_plotter import g_plotter
server_1  |   File "/usr/local/lib/python3.7/site-packages/g_plotter/g_plotter.py", line 7, in <module>
server_1  |     import Gparser
server_1  | ModuleNotFoundError: No module named 'Gparser'

当我自己运行子模块(这是一个烧瓶应用程序)时,它会工作。

1 个答案:

答案 0 :(得分:1)

您必须在python 3中使用绝对导入,不再允许import Gparser。您可以将其更改为:

from . import Gparser
from g_plotter import Gparser

让您更加清楚,我将描述它们的含义。

import Gparser

Gparser = load_module()
sys.modules['Gparser'] = Gparser

from g_plotter import Gparser

Gparser = load_module()
sys.modules[Gparser_name] = Gparser

from . import Gparser

package = find_package(__name__)  # 'g_plotter'
Gparser_name = package + 'Gparser'  # g_plotter.Gparser
Gparser = load_module()
sys.modules[Gparser_name] = Gparser

现在您可以理解,如果直接运行g_plotter,实际上__name____main__,因此python无法从中找到包。仅当将此子模块导入其他模块时,from . import something才能工作。