【发布时间】: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