python threading.timer define o limite de tempo quando o programa fica sem tempo
Eu tenho algumas perguntas relacionadas à definição do tempo máximo de execução de uma função no Python. Na verdade, eu gostaria de usarpdfminer
para converter o.pdf
arquivos para.txt
.
O problema é que, com muita freqüência, alguns arquivos não são possíveis de decodificar e levam um tempo extremamente longo. Então eu quero definirthreading.Timer()
para limitar o tempo de conversão de cada arquivo para 5 segundos. Além disso, corro sob o Windows para não poder usar osignal
módulo para isso.
Consegui executar o código de conversão compdfminer.convert_pdf_to_txt()
(no meu código é "c
"), mas não tenho certeza de que o código a seguir,threading.Timer()
trabalho. (Não acho que restrinja adequadamente o tempo de cada processamento)
Em resumo, quero:
Converta o pdf para txt
O prazo para cada conversão é de 5 s. Se ficar sem tempo, lance uma exceção e salve um arquivo vazio
Salve todos os arquivos txt na mesma pasta
Se houver exceções / erros, ainda salve o arquivo, mas com conteúdo vazio.
Aqui está o código atual:
import converter as c
import os
import timeit
import time
import threading
import thread
yourpath = 'D:/hh/'
def iftimesout():
print("no")
with open("D:/f/"+g+"&"+t+"&"+name+".txt", mode="w") as newfile:
newfile.write("")
for root, dirs, files in os.walk(yourpath, topdown=False):
for name in files:
try:
timer = threading.Timer(5.0,iftimesout)
timer.start()
t=os.path.split(os.path.dirname(os.path.join(root, name)))[1]
a=str(os.path.split(os.path.dirname(os.path.join(root, name)))[0])
g=str(a.split("\\")[1])
with open("D:/f/"+g+"&"+t+"&"+name+".txt", mode="w") as newfile:
newfile.write(c.convert_pdf_to_txt(os.path.join(root, name)))
print("yes")
timer.cancel()
except KeyboardInterrupt:
raise
except:
for name in files:
t=os.path.split(os.path.dirname(os.path.join(root, name)))[1]
a=str(os.path.split(os.path.dirname(os.path.join(root, name)))[0])
g=str(a.split("\\")[1])
with open("D:/f/"+g+"&"+t+"&"+name+".txt", mode="w") as newfile:
newfile.write("")