【问题标题】:running tornado python in docker: ModuleNotFoundError: No module named '__main__.config'; '__main__' is not a package在 docker 中运行 tornado python: ModuleNotFoundError: No module named '__main__.config'; '__main__' 不是一个包
【发布时间】:2019-05-14 14:44:06
【问题描述】:

我有一个 Tornado 应用程序,其文件结构如下:

projectfolder
|_ Dockerfile
|_ src
 |_ __init__.py
 |_ __main__.py
 |_ config.py

我的 dockerfile 看起来像这样:

FROM python:3.7
EXPOSE 8888

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY requirements.txt /usr/src/app/
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENTRYPOINT ["python3", "projectfolder/__main__.py"]

__main__.py 我做from .config import Config

当做 docker run 我得到:

File "projectfolder/__main__.py", line 11, in <module>
  from .config import Config
ModuleNotFoundError: No module named '__main__.config'; '__main__' is not a package

当我在 .venv 中运行项目时,它工作正常,但我无法让它在 docker 上工作

关于如何正确导入当前文件夹中的文件有什么想法吗?或者我应该如何在其他遵循 python 最佳实践的情况下重新构建我的文件

谢谢!

【问题讨论】:

  • 如果我将所有文件向上移动一个文件夹(连同 Dockerfile),然后删除 .它的工作原理

标签: python docker tornado


【解决方案1】:

1.我猜你的ENTRYPOINT ["python3", "projectfolder/__main__.py"]打错了,应该是ENTRYPOINT ["python3", "src/__main__.py"],否则你会得到:

python3: 无法打开文件 'projectfolder/ma​​in.py': [Errno 2] 没有这样的文件或目录

我猜你在最小化你的问题时犯了一些错误,因为COPY . .不会复制projectfolder,而是projectfolder的内容。

2.回到你的问题:

ModuleNotFoundError: 没有名为 '__main__.config' 的模块; '__main__' 不是一个包

这里,python find __name____main__,这意味着调用from .config import Config 的脚本是顶级脚本,而不是在包中。

relative import 只能在包中使用,不能在包外使用。因此,您只需将from .config import Config 更改为from config import Config,删除.,这意味着相对导入可以解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-19
    • 2019-11-29
    • 2023-01-22
    • 2020-06-26
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 2022-08-24
    相关资源
    最近更新 更多