微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

仅在部署期间自定义模块导入错误

如何解决仅在部署期间自定义模块导入错误

我有一个非常简单的 Flask 应用程序结构如下:

Dockerfile
requirements.txt
caller --> app.py
       --> user.py
       --> templates
       --> static

我正在 Flask 中初始化并运行我的 app.py 应用:

app.py

from twilio.rest import Client 
import sys,os
...
from user import User,Anonymous   
app = Flask(__name__)
...
def create_app():
    app.run(debug=True,host='0.0.0.0',port=5005)

当我在本地运行我的应用程序时,它工作正常,但是当我尝试制作图像并运行图像时,它给了我一个错误

  File "/caller/caller/app.py",line 11,in <module>
    from user import User,Anonymous
ModuleNotFoundError: No module named 'user'

dockerfile

FROM python:3.7.5-slim-buster


ENV INSTALL_PATH /caller
RUN mkdir -p $INSTALL_PATH

workdir $INSTALL_PATH

copY requirements.txt requirements.txt
RUN pip install -r requirements.txt
RUN pip install flask_login

copY . .

CMD gunicorn -b 0.0.0.0:8000 --access-logfile - "caller.app"

user.py

import uuid

class User():
  ...


class Anonymous():
  ...

你知道我该如何解决这个问题吗?这也是我的第一个 Dockerfile,这可能是问题所在。为了构建和运行我正在做的图像docker build -t foo . && docker run -it foo

解决方法

Python 的导入系统通过在解释器定义的路径列表中搜索模块来工作。您可以通过选中 sys.path 来查看此列表。如果您查看 documentationpath[0] 处的第一项是包含您从中调用解释器的脚本的目录。

您通过从您在 Dockerfile 中设置的工作目录 gunicorn 运行 /caller 来调用 Python。所以这是 Python 在 path[0] 中用于导入系统的基本目录。因此,当遇到 from user import User,Anonymous 行时,Python 会尝试从 /caller 导入它,其中包含您的 Dockerfile、requirements.txt 和您复制到的 /caller/ 目录(通过 COPY . .在您的 Dockerfile 中)。所以包位于 /caller/caller/user.py 而不是 /caller/user.py...导入系统没有看到它,你会得到你的错误。

您可以通过两种方式修复:

1. 更改您的代码以使用相对导入。这将告诉 Python 导入系统在同一目录中查找:

from .user import User,Anonymous

2.您还可以通过更改 Dockerfile 将 /caller 的内容复制到容器中的 /caller 工作目录而不是递归 {{ 1}} 调用你复制所有内容。

COPY . . 替换 COPY . . 并更新 COPY caller . 以仅调用 gunicorn 而不是 app(因为它不再嵌套在第二个调用者目录中)。

现在,user.py 将位于您容器中的 caller.app,Python 导入系统会在检查 /caller/user.py 时找到它

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?