提问人:Atro_TLT 提问时间:10/30/2023 最后编辑:Atro_TLT 更新时间:10/30/2023 访问量:72
无法在我的测试文件中导入我自己的模块
Can't import my own module in my test file
问:
我有以下项目结构:
.
├── README.md
├── document_processing
│ ├── Config.py
│ ├── DocumentParser.py
│ ├── FileChecker.py
│ └── __init__.py
├── indexing.py
└── tests
├── CheckFileTest.py
└── __init__.py
在 CheckFileTest.py 中,我为 FileChecker.py 函数实现了一些测试。
import unittest
from document_processing.Config import Config
from document_processing.FileChecker import FileChecker
class CheckFileTest(unittest.TestCase):
def __init__(self):
self.config = Config()
self.fc = FileChecker(self.config)
def test_not_empty_line(self):
...
def test_line_format(self):
...
if __name__ == "__main__":
unittest.main()
不幸的是,当我尝试运行测试文件(从项目根目录启动)时,我遇到了这个错误:
Traceback (most recent call last):
File "/Users/thomaslaurent/Dev/MIRCV_project/tests/CheckFileTest.py", line 3, in <module>
from document_processing.Config import Config
ModuleNotFoundError: No module named 'document_processing
我已经看到了很多东西,但我无法弄清楚这个结构挡住了什么。
具有相对导入:
from ..document_processing.Config import Config
我收到这个错误:
ImportError: attempted relative import with no known parent package
编辑
根据@sinoroc的评论,我没有将测试作为包,而是创建了一个 setup.py 文件:
from setuptools import setup
setup(
name="MIRCV_project",
version="1.0",
description="",
author="Thomas LAURENT",
author_email="",
packages=["document_processing"],
install_requires=[], # external packages acting as dependencies
)
我终于跑了:
python -m pip install --editable .
您可以投票给之前 setup.py 配置@sinoroc答案:如何为独立应用程序制作 setup.py
答:
from ..document_processing.Config import Config
from ..document_processing.FileChecker import FileChecker
评论
Python 搜索相对于它加载的程序文件的目录。
如果正在运行,则有效根目录(用于包搜索)是 。那不是当前目录,只是包搜索根目录。tests/CheckFileTest.py
tests/
对于要从 开始导入,它必须导入 ../document_processing/Config.py。它需要从测试中搜索目录树,而 Python 不这样做。如果它这样做了,它可能会一直回溯到根目录,并最终搜索整个文件系统,这可能会非常慢。Python 仅从给定的搜索根目录向下查找目录树。CheckFileTest.py
Config.py
tests
有几种方法可以解决这个问题。诡计多端的方法是修改搜索路径以包含其他搜索根目录。
例如,如果您希望它相对于您发出命令的当前目录进行搜索(如示例中所示):
import os, sys
sys.path.append(os.getcwd())
from document_processing.Config import Config
from document_processing.FileChecker import FileChecker
或者,如果您可以从任何地方执行该命令,并且确实希望它相对于安装进行导入,则可以执行以下操作:
import sys
sys.path.append('..')
from document_processing.Config import Config
from document_processing.FileChecker import FileChecker
但这只有在同行的情况下才会起作用。document_processing
tests
更好的方法是将项目重新组织为单个包,如下所示:
.
├── README.md
├── indexing.py
└── tests
├── CheckFileTest.py
├── __init__.py
└── document_processing
├── Config.py
├── DocumentParser.py
├── FileChecker.py
└── __init__.py
然后,无论您从哪个目录运行程序,从 CheckFileTest.py 导入都将按照您编写的方式工作。
评论
document_processing
sys.path
sys.path
sys.path
document_processing
tests
评论
python3 -c 'import document_processing; print(document_processing)'
python3 -m unittest
sys.path
PYTHONPATH