python threading.timer establece el límite de tiempo cuando el programa se queda sin tiempo

Tengo algunas preguntas relacionadas con la configuración del tiempo de ejecución máximo de una función en Python. De hecho, me gustaría usarpdfminer para convertir el.pdf archivos a.txt.

El problema es que muy a menudo, algunos archivos no son posibles de decodificar y toman mucho tiempo. Entonces quiero establecerthreading.Timer() para limitar el tiempo de conversión para cada archivo a 5 segundos. Además, corro bajo Windows, así que no puedo usar elsignal módulo para esto.

Logré ejecutar el código de conversión conpdfminer.convert_pdf_to_txt() (en mi código es "c"), pero no estoy seguro de que en el siguiente código,threading.Timer() trabajos. (No creo que limite adecuadamente el tiempo para cada procesamiento)

En resumen, quiero:

Convierte el pdf a txt

El límite de tiempo para cada conversión es de 5 segundos, si se agota el tiempo, lanza una excepción y guarda un archivo vacío

Guarde todos los archivos txt en la misma carpeta

Si hay alguna excepción / error, aún guarde el archivo pero con contenido vacío.

Aquí está el código actual:

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("") 

Respuestas a la pregunta(2)

Su respuesta a la pregunta