2015-03-27 2 views
0

Я работаю в среде, где я бы хотел оставить сценарий, работающий в ночное время, но по политическим причинам не может предположить, что компьютер останется включенным (автоматическое выключение безрезультатно после произвольного периода времени).Лучшая практика для ввода текста в файл при внезапном закрытии программы, вероятно, с Python

У меня есть скрипт python, который записывает в текстовый файл. Во время тестирования, когда я необоснованно завершаю программу, некоторые тексты будут частично записаны в файл. Я также использую модуль csv.

Попытка приблизительной код здесь:

import csv 

outCSV = open("filename.txt", "a") 

#more code here for writing multiline non CSV "header" block if file doesn't already exist 

csvWriter = csv.writer(outCSV,lineterminator='\n') 

#loop through a list, using values to derive other data for writing out later 
lookupList = range(5) 

for row in lookupList: 
    #function to return list of data elements from web source for CSV writer, using range(100) for mock data 
    outDataRow = range(100) 
    csvWriter.writerow(outDataRow) 
    #save after each row in case script is closed aburptly 
    outCSV.flush() 

print "done!" 

Я понимаю, что приведенный выше пример тривиален, он, вероятно, работает слишком быстро, чтобы надежно закрыть сценарий так, что csvWriter.writerow() не закончить выписывая линию , Фактический проект включает проверку содержимого на веб-сайте, где каждый URL-адрес занимает до 15 секунд для загрузки, а затем записывает потенциально сотни элементов в строку. Глядя больше на концептуальный ответ (я подозреваю, что проблема заключается в том, что «csvWriter.writerow (outDataRow)» все еще выполняется, и программа закрывается).

Пока что лучшая идея, которую я имел, заключается в том, чтобы создать средство проверки ошибок, чтобы перейти через любой выход (после перезапуска на следующий день), который ищет неполные записи и повторяет эти строки. Хотите узнать, есть ли более умный способ?

P.S. Я пробовал искать, но даже выбрать эффективные ключевые слова было сложно, простите, если это дублированный вопрос (добавьте ключевые слова, чтобы найти его в комментариях?)

+0

использовать namedTemporoaryFile и shutil.move делает запись в блоках, если требуется –

ответ

0

Я думаю, вы должны смотреть на signal module. вот краткое объяснение, связанное с вашим делом.

Когда операционная система перезагружается, она сначала посылает сигналы всем программам. Это говорит о программах «пожалуйста, закройте сейчас!». программы несут ответственность за очистку и закрытие. сигналы используются и в других вещах, но это то, что связано с вами.

В python (и других) мы пишем функцию для обработки сигнала, то есть для очистки и выхода при получении сигнала. Обработка сигналов осуществляется как это в Python:

import signal #you need this to handle signals 
import time  #used in this simple example 

#open a file 
f = open ('textfile.txt', 'w') 

#signal handler. it has two parameters 
#signum: signal number. there are many signals each with its number 
#frame: i am not really sure what this is but i guess it is used for 
#  things i do not need. just a guess though 
def sig_handler (signum, frame): 
    #print debugging information 
    print ('got', signum, 'signal, closing file...') 
    #close the file before exiting 
    f.close() 
    print ('exiting') 
    #exit. you have to write this to end the program from here 
    exit (1) 

#create signal handler 
#when `SIGTERM` signal is received, call function `sig_handler` 
#if program receive the signal without creating a handler for it, the program 
#will terminate without any clean up 
signal.signal (signal.SIGTERM, sig_handler) 

#infinite loop. will never end unless a signal is received to stop the program 
while True: 
    #write to file 
    print ('test line', file=f) 
    #delay to simulate slow writing to file 
    time.sleep (1) 

вы должны знать, какой сигнал посылается, когда операционная система завершает работу или просто обрабатывать все возможные сигналы с одного обработчика. Я думаю, что SIGTERM - это тот, который используется для завершения процессов во время закрытия, но я не уверен.

есть 1 сигнал, с которым вы никогда не справитесь, и ваша программа просто будет закрыта без какой-либо очистки (я уверен, что в UNIX, например, присутствует в окнах). но тот отправляется в редких случаях (например, программа зависает и не закрывается после отправки SIGTERM или других сигналов).

надеюсь, что это помогает ...