Python 没有名为 <foldername> 的模块,带有 docker 设置

Python no module named <foldername> with docker setup

提问人:Henry 提问时间:3/15/2023 更新时间:3/15/2023 访问量:190

问:

我有一个在 docker 容器中运行的 python 项目。

我的开发环境结构如下:

-- app
---- Module1
------ ClassM1.py
---- Module2
----- ClassM2.py
---- main.py
-- docker-compose.yml

在我的撰写文件中,我正在安装 ./app/:/app/

在开发时(在 PyCharm 中),我在 main.py 中使用了这个导入行,没有问题:

from app.Module1.ClassM1 import ClassM1
from app.Module1.ClassM2 import ClassM2

但是当我在容器中部署代码时,我得到

“ModuleNotFoundError:没有名为'app'的模块”

我已经尝试过:

  • 在根目录中创建一个__init__.py
  • export PYTHONPATH=.
  • 导入 sys 并执行 sys.path.append(“./”)

我发现了一个类似的问题,但没有答案:Python/Docker - ModuleNotFoundError:没有名为

Python Docker 命名空间

评论

0赞 David Maze 3/15/2023
您描述的卷装载可能会导致一些不一致;删除它有帮助吗?您的文件和文件中有什么?Dockerfiledocker-compose.yml
0赞 Henry 3/15/2023
我的 compose 很简单,Dockerfile 将 workdir 设置为 /appbuild: . volumes: - ./app/:/app/
0赞 David Maze 3/15/2023
您是否正在构建一个包含代码的映像;Dockerfile 字面上只是一行和一行吗?如果此设置的目标是在不使用 Docker 的映像系统或其他功能的情况下运行仅存在于主机上的代码,那么使用不使用 Docker 的纯 Python 虚拟环境可能会更容易。FROMWORKDIR
1赞 yong 3/15/2023
尝试添加并放入 Dockerfile,并在撰写文件中将挂载更改为ENV PYTHONPATH=.:$PYTHONPATHWORKDIR /apps./app:/apps/app
0赞 Henry 3/18/2023
可悲的是,我以为它已经解决了问题......问题是,这一切都以 cronjob 的形式运行。问题是,为了让它工作,我的 cron 行看起来像这样,main.py 位于 /apps/app 中。main.py 中导入 ClassM1.py 有效(前面没有应用程序),但是在 ClassM1.py 中我也需要导入 ClassM2.py 所以我这样做了,但又说找不到应用程序cd /app && /usr/local/bin/python3 main.pyfrom app.ClassM2 import ClassM2

答:

0赞 Ajay Meena 3/15/2023 #1

默认情况下,它不应该在 docker 之外工作。导入文件时,Python 只搜索运行入口点脚本的目录和 sys.path,其中包括包安装目录等位置(实际上比这更复杂一些,但这涵盖了大多数情况)。

您可以使用以下功能:

from Module1.ClassM1 import ClassM1
from Module2.ClassM2 import ClassM2

PS:您的代码中有错别字

from app.Module1.ClassM2 import ClassM2 -> from app.Module2.ClassM2 import ClassM2

评论

0赞 Henry 3/18/2023
我可以在我的 main.py 中删除该应用程序,但现在我的问题是在 ClassM1 中我使用的是 ClassM2,但这里我再次出现 ModuleNotFound 错误......错别字是因为我手写了伪代码。我的正确模块结构有点复杂