分离文件夹/文件抽象的零碎管道

2024-05-16 10:17:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在完成一个无聊的项目,但是我有一个相当长的pipelines.py文件。在

我注意到,在我的settings.py中,管线显示如下(修剪过):

ITEM_PIPELINES = {
     'proj.pipelines.MutatorPipeline': 200,
     'proj.pipelines.CalculatorPipeline': 300,
     'proj.pipelines.SaveToFilePipeline': 500,
}

我尝试了以下方法来纠正这个问题。在

1.)我创建了一个新的文件/文件夹,并尝试以相同的方式从管道引用它。在

文件夹是myPipelines/Test.py,类名为TestPipeline,然后在管道设置中引用为proj.myPipelines.Test.TestPipeline': 100,。在

这让我犯了错误。在

然后我想我可以导出这个模块并导入到我当前的pipelines.py中,它将从中获取引用。我在我的myPipelines目录中添加了一个空的__init__.py,然后又添加了from myPipelines.Test import TestPipeline,但是scrapy仍然抛出一个错误。。。在

^{pr2}$

先谢谢你!在


Tags: 文件项目pytest文件夹管道settings错误
1条回答
网友
1楼 · 发布于 2024-05-16 10:17:10

当你开始一个糟糕的项目时,你会得到一个这样的目录树:

$ scrapy startproject multipipeline
$ tree
.
├── multipipeline
│   ├── __init__.py
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── settings.py
│   └── spiders
│       ├── example.py
│       └── __init__.py
└── scrapy.cfg

生成的pipelines.py如下所示:

^{pr2}$

但是你的scrapy项目可以引用任何Python类作为项管道。一种方法是将生成的One-file pipelines模块转换为自己目录中的包,其中包含子模块。 注意pipelines/目录中的__init__.py文件:

$ tree
.
├── multipipeline
│   ├── __init__.py
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines
│   │   ├── __init__.py
│   │   ├── one.py
│   │   ├── three.py
│   │   └── two.py
│   ├── settings.py
│   └── spiders
│       ├── example.py
│       └── __init__.py
└── scrapy.cfg

pipelines/目录中的各个模块如下所示:

$ cat multipipeline/pipelines/two.py 
# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
import logging


logger = logging.getLogger(__name__)


class MyPipelineTwo(object):
    def process_item(self, item, spider):
        logger.debug(self.__class__.__name__)
        return item

你可以读more about packages here。在

The __init__.py files are required to make Python treat the directories as containing packages; this is done to prevent directories with a common name, such as string, from unintentionally hiding valid modules that occur later on the module search path. In the simplest case, __init__.py can just be an empty file, but it can also execute initialization code for the package or set the __all__ variable, described later.

你的settings.py将包含如下内容:

ITEM_PIPELINES = {
    'multipipeline.pipelines.one.MyPipelineOne': 100,
    'multipipeline.pipelines.two.MyPipelineTwo': 200,
    'multipipeline.pipelines.three.MyPipelineThree': 300,
}

相关问题 更多 >