python - 在docker中运行tornado python : ModuleNotFoundError: No module named '__main__.config' ; '__main__' is not a package

标签 python docker tornado

我有一个 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/

相关文章:

python - 更新字典中现有值的更多pythonic方式

python - 在python中自动将所有相对导入转换为绝对导入

docker - Docker 中的容器运行时在哪里执行?

docker - 如何在 Docker 中支持多播网络

python - 使用 conda 降级和升级 python 库

python - 我制作了这个算法来告诉你一个数字是否是质数,但我不明白为什么不同缩进级别上的 'if-else statement' 有效

c# - 使用非管理员用户访问Windows容器内的Docker主机管道

nginx - Gridfs-Nginx 与来自 Tornado 的 Gridfs

python - 在Tornado中进行异步xmlrpc(客户端调用)

asynchronous - 同步 redis 调用是否会使 Tornado 应用程序变慢?