在docker中运行龙卷风python:ModuleNotFoundError:没有名为'__main __。config'的模块; “ __main__”不是软件包

时间:2019-05-14 14:44:07

标签: python docker 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最佳做法在其他文件中重新构建文件

谢谢!

1 个答案:

答案 0 :(得分:0)

1。。我猜您有一个ENTRYPOINT ["python3", "projectfolder/__main__.py"]的错字,应该是ENTRYPOINT ["python3", "src/__main__.py"],否则您将得到:

  

python3:无法打开文件'projectfolder / main .py':[错误2]没有这样的文件或目录

我想您在问最少问题时就犯了一个错误,因为COPY . .不会复制projectfolder,而是复制projectfolder的内容。

2。。返回您的问题:

  

ModuleNotFoundError:没有名为“ __main __。config”的模块; “ __main__”不是软件包

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

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