【问题标题】:Unable to find module after import导入后找不到模块
【发布时间】:2018-11-09 01:46:05
【问题描述】:

我正在运行 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'

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

【问题讨论】:

  • 你的结构是错误的。例如要导入Gparser,你应该写from g_plotter import Gparser,因为它在一个模块中。
  • @Sraw,然后在烧瓶应用程序中直接运行它时我得到“ImportError:无法从'g_plotter'导入名称'Gparser'”。在我的主应用程序中,它也出现错误“ModuleNotFoundError:没有名为'Gparser'的模块”
  • 这是因为你的设计是错误的......在评论中解释起来有点困难。但基本上你可以想象,当你直接在包内运行你的包时,目录结构不包含你的包顶级目录。但是当您将它用作包时,目录结构将包含您的包的目录。不知道够不够清楚... 本质上是 package 有一个额外的 wrapper 目录。

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


【解决方案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才能工作。

【讨论】:

  • 这些对我不起作用。直接从命令行运行子模块会给我:“ from .import Gparser ImportError: cannot import name 'Gparser”
  • @user994165 你不能在主模块中使用from . import something。此语句必须在一个包中使用。
  • 好的。我将子模块脚本移动到根级别并将导入更改为“from g_plotter import Gparser”,并在应用程序中使用相同的导入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 2017-10-13
  • 1970-01-01
  • 2023-04-02
  • 2019-09-25
  • 2022-01-16
相关资源
最近更新 更多