导入Flask中的文件

huangapple go评论94阅读模式
英文:

Import files in Flask

问题

在 Flask 应用程序中,您从同一目录下的其他 Python 文件中导入了一些函数。在 app.py 文件中,您导入了以下内容:

from kafka_handler import KafkaReceiver, KafkaSender, logger

同时,在应用程序目录下有一个名为 tests 的文件夹,其中包含了 BaseCase.py 文件:

from src.app import app

但是,当尝试运行测试时,使用以下命令:

python3 -m unittest discover tests

您遇到了以下错误:

ModuleNotFoundError: No module named 'kafka_handler'

您还提到您有一个 Docker 镜像来运行应用程序,并且想要知道如何在不破坏应用程序的情况下运行测试。

为了解决这个问题,您需要确保测试代码能够访问到正确的模块。根据您的项目结构,您可以采取以下步骤:

  1. 确保项目结构正确,确保 kafka_handler.py 文件位于 src 文件夹下,并且 BaseCase.py 位于 tests 文件夹下。

  2. BaseCase.py 中,使用正确的相对导入方式导入模块。您可以使用 from ..src.app import app 来确保正确的相对导入。请注意,相对导入的可用性取决于 Python 版本,确保您的 Python 版本支持相对导入。

  3. 在运行测试之前,确保您的 Docker 镜像包含了正确的项目结构。根据您提供的 Dockerfile,它看起来已经复制了项目的文件,因此在应用程序目录下应该有 srctests 文件夹。确保 Docker 容器中的 Python 环境与您的本地环境相匹配。

完成这些步骤后,您应该能够在不破坏应用程序的情况下运行测试。如果问题仍然存在,请检查您的项目结构和导入语句,确保它们都正确无误。

英文:

I have a flask app, inside the app I import some functions from another python files live on the same directory,
inside app.py
from kafka_handler import KafkaReceiver, KafkaSender, logger
and I have tests folder inside it I have BaseCase.py
from src.app import app
but when try to run the test using python3 -m unittest discover tests I got this error from kafka_handler import KafkaReceiver, KafkaSender, logger
ModuleNotFoundError: No module named 'kafka_handler'

I have a docker image to run the application, what should I do to make the tests runs without breaking the application

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-html -->

FROM python:3.11
WORKDIR /app
RUN pip3 install --upgrade pip
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
ENV PYTHONPATH=/app
COPY src /app

EXPOSE 8000
CMD [&quot;python&quot;, &quot;app.py&quot;]

<!-- end snippet -->

and the project tree is as the following

project
    src
       __init__.py
       pp.py
       kafka_hander.py
    tests
      __init__.py
      BaseCase.py
      test_something.py

</details>


# 答案1
**得分**: 1

尝试在你的导入语句前加一个点,`from .kafka_handler import KafkaReceiver, KafkaSender, logger`。
在这篇文章的相应部分找到有关相对导入的详细信息:

    https://realpython.com/absolute-vs-relative-python-imports/

根据你提供的信息,似乎 `BaseCase` 充当 `__main__` 文件并导入 `app.py`。因此,它需要知道如何找到 `kafka_handler.py` 的引用/路径。

<details>
<summary>英文:</summary>

Try prefix your import with a dot, `from .kafka_handler import KafkaReceiver, KafkaSender, logger`.
Find detailed information about relative imports in according section of this article:

    https://realpython.com/absolute-vs-relative-python-imports/

 
Based on the information you provided, it seems that the BaseCase serves as `__main__` file and imports `app.py`. Therefore it needs to know the reference / path, where to find `kafka_handler.py`.


  [1]: https://realpython.com/absolute-vs-relative-python-imports/

</details>



huangapple
  • 本文由 发表于 2023年8月10日 18:37:25
  • 转载请务必保留本文链接:https://go.coder-hub.com/76874939.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定