我有一个 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. 我猜你的 ENTRYPOINT ["python3", "projectfolder/__main__.py"]
有一个拼写错误,它应该是 ENTRYPOINT ["python3", "src/__main__.py"]
,否则你会得到:
python3: can't open file 'projectfolder/main.py': [Errno 2] No such file or directory
我猜你在最小化问题时犯了一些错误,因为 COPY 。 .
不会复制 projectfolder
,而是复制 projectfolder
的内容。
2.回到您的问题:
ModuleNotFoundError: No module named '__main__.config'; '__main__' is not a package
这里,python find __name__
是 __main__
,这意味着调用 from .config import Config
的脚本是顶级脚本,而不是在一个包。
并且相对导入
只能在包内使用,不能在包外使用。因此,您只需将 from .config import Config
更改为 from config import Config
,删除 .
这意味着相对导入就可以解决您的问题。
关于python - 在docker中运行tornado python : ModuleNotFoundError: No module named '__main__.config' ; '__main__' is not a package,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56133142/