退出 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")
我喜欢:)
我正在尝试通过调用 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")
我喜欢:)