英文:
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 镜像来运行应用程序,并且想要知道如何在不破坏应用程序的情况下运行测试。
为了解决这个问题,您需要确保测试代码能够访问到正确的模块。根据您的项目结构,您可以采取以下步骤:
-
确保项目结构正确,确保
kafka_handler.py
文件位于src
文件夹下,并且BaseCase.py
位于tests
文件夹下。 -
在
BaseCase.py
中,使用正确的相对导入方式导入模块。您可以使用from ..src.app import app
来确保正确的相对导入。请注意,相对导入的可用性取决于 Python 版本,确保您的 Python 版本支持相对导入。 -
在运行测试之前,确保您的 Docker 镜像包含了正确的项目结构。根据您提供的 Dockerfile,它看起来已经复制了项目的文件,因此在应用程序目录下应该有
src
和tests
文件夹。确保 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 ["python", "app.py"]
<!-- 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>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论