退出Python程序

时间:2015-01-21 14:54:53

标签: python web-scraping scrapy

我试图通过调用sys.exit()来退出python程序,但它似乎没有工作。

程序结构类似于:

def func2():
    *does some scraping operations using scrapy*

def func1():
    Request(urls, callbakc=func2)

所以,在这里,func1正在请求一个URL列表和回调方法,正在调用func2。如果func2

出现问题,我想退出程序的执行

func1中检查对象类型时,我找到了它和http.Request对象。

此外,由于我使用scrapy,每当我在sys.exit()中调用func2时,都会调用列表中的下一个url并继续执行程序。

我也尝试使用全局变量来停止执行但无济于事。

我哪里错了?

2 个答案:

答案 0 :(得分:1)

根据How can I instruct a spider to stop itself?,您需要提出CloseSpider exception

raise CloseSpider('Done web-scraping for now')

另见:

由于Scrapy基于sys.exit()

,因此

twisted无效

答案 1 :(得分:0)

即使我们不知道如何完全停止,Python的mutable-object default binding "gotcha"也可以帮助我们从某个角落跳过所有回调。

以下是您可以做的事情:

首先,创建一个函数,生成包含其他带条件的回调函数。它的第二个参数cont将绑定到可变对象(list),因此我们可以在创建后影响所有回调它们。

def callback_gen(f, cont=[True]):
    def c(response):
        if cont[0]:
            f(response, cont=cont)
        else:
            print "skipping" # possibly replace with pass
    return c

现在制作一些测试功能:

def func2(response, cont=None):
    print response
    print cont
    # this should prevent any following callback from running
    cont[0]=False

def func3(response, cont=None):
    print response
    print cont

现在创建两个回调,第一个回调是func2,这会阻止以下回调运行。

f2 = callback_gen(func2)
f3 = callback_gen(func3)
f2("func2")
f3("func3")

我喜欢它:)