2015-01-21 6 views
0

Я пытаюсь выйти из программы python, позвонив по номеру 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-адрес в списке и выполнение программы продолжается.

Я также попытался использовать глобальную переменную, чтобы остановить выполнение, но безрезультатно.

Где я иду не так?

+0

sys.exit вызывает исключение SystemExit. Есть ли у вас голая попытка: кроме прохода? – zehnpaard

+0

@zehnpaard no. каждый 'try' имеет« except »в моем коде. Просто проверил. –

ответ

0

Даже если мы не знаем, как полностью остановиться, mutable-object default binding "gotcha" Python может помочь нам пропустить все обратные вызовы с определенной точки.

Вот что вы можете сделать:

Во-первых, создать функцию генерации оберточной другие функции обратного вызова с условием. Второй аргумент 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") 

мне это нравится :)

Смежные вопросы