退出 Python 程序

Quitting a Python program

我正在尝试通过调用 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,每当我在 func2 中调用 sys.exit() 时,列表中的下一个 url 就会被调用,程序将继续执行。

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

我哪里错了?

根据 How can I instruct a spider to stop itself?, you need to raise CloseSpider exception:

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

另见:

  • Running Scrapy tasks in Python

sys.exit() 在这里不起作用,因为 Scrapy 是基于 twisted.

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

您可以执行以下操作:

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

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")

我喜欢:)