2016-03-23 1 views
0

Я несколько новичок в Python, поэтому я думаю, что этот вопрос имеет простой ответ. Но я не могу найти решение нигде.Как я могу завершить скрипт Python вручную, не прерывая вывод файла?

У меня есть сценарий Python, который постоянно принимает входные данные от потокового API и сохраняет данные в файл.

Моя проблема, когда мне нужно остановить скрипт, чтобы изменить код. Если я использую ctrl-f2, я когда-нибудь поймаю скрипт, когда он находится в процессе записи в выходной файл, и файл окажется поврежденным.

Есть ли простой способ остановить Python вручную, что позволяет завершить выполнение текущей строки кода?

+1

Это звучит как проблема для [ 'signal'] (https: //docs.python. org/3.5/library/signal.html) и ['atexit'] (https://docs.python.org/3.5/library/atexit.html). Тем не менее, вы можете рассмотреть транзакционную базу данных для сохранения данных. – ChrisP

+0

Я бы второй atexit ... –

+0

Спасибо. Хотя я должен был указать в вопросе, что я использую кнопку «Стоп» Pycharm, чтобы убить скрипт. И, похоже, он не может быть пойман, поскольку он посылает сигнал сигкилла. Есть ли другой способ остановить скрипт, который отправит другой сигнал? Я пробовал Ctrl-C и, похоже, не работал с Pycharm. – mgalka

ответ

0

Вы можете поймать сигнал SIGTERM или SIGINT и установить глобальную переменную, которую ваш скрипт регулярно проверяет, должен ли он выйти. Это может означать, что вам нужно разбить ваши операции на более мелкие куски, так что вы можете проверить переменный выход чаще

import signal 

EXIT = False 

def handler(signum, frame): 
    global EXIT 
    EXIT = True 

signal.signal(signal.SIGINT, handler) 


def long_running_operation(): 
    for i in range(1000000): 
     if EXIT: 
      # do cleanup or raise exception so that cleanup 
      # can be done higher up. 
      return 
     # Normal operation. 
+0

Спасибо. Хотя похоже, что кнопка Stop Pycharm посылает сигнал sigkill, который этот метод не поймает. Знаете ли вы, есть ли другой способ остановить скрипт Python, который отправит захватывающий сигнал? – mgalka

+0

Если вы используете его из оболочки, CTRL-C отправит SIGINT –

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