Pytest + ModuleNotFoundError:没有名为“ project_name.settings”的模块

时间:2019-12-03 15:30:48

标签: python scrapy pytest setup.py

我正在尝试使用pytest测试一个抓痒的蜘蛛。我想确保已经使用该特定名称生成了一个蜘蛛说X。我可以使用以下代码片段从脚本中抓取蜘蛛:

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
process = CrawlerProcess(get_project_settings())
spiders =  list(process.spiders._spiders.keys())

但是,当我试图在pytest中运行相同的代码片段时,出现错误:

ModuleNotFoundError: No module named 'project_name.settings'

我的项目目录如下。

**project_name**
├── __init__.py
├── scrapy.cfg
├── setup.py
├── **project_name**
│   ├── cli
│   ├── conftest.py
    ├── __init__.py
    ├── settings.py
    ├── spiders
    ├── tests
       ├── unit

我认为问题出在我创建pip包的方式上,因为scrapy的get_project_settings()正在请求project_name.settings的setup.py中已“重新映射”的project_name.project_name.settings模块,但是pytest不知道在哪里找到该project_name.settings。它可以看到它是否为project_name.project_name.settings,但不能看到它。这是我的setup.py:

from setuptools import setup
from setuptools import find_packages

setup(
    name='project_name',
    description='',
    version='0.1',
    packages=find_packages(),
)

现在,我不知道如何让pytest理解project_name.settings实际上意味着project_name.project_name.settings使用setup.py或pytest插件。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

子文件夹必须具有相同的名称吗?无论如何,它无法使用该名称查找模块,因为它不存在。您需要通过在其中添加空白的 init .py文件,将 project_name 子目录作为模块。您可能还需要从设置内部或完整路径中指定相对路径。因此,.project_nameproject_name.project_name。希望这可以帮助。