límite de configuración de Python para el tiempo de ejecución con el bucle while

Tengo algunas preguntas relacionadas con la configuración del tiempo de ejecución máximo en Python. De hecho, me gustaría usar pdfminer para convertir los archivos pdf a .txt. El problema es que muy a menudo, algunos archivos no se pueden decodificar y toman mucho tiempo. Así que quiero establecer time.time() para limitar el tiempo de conversión para cada archivo a 20 segundos. Además, corro bajo Windows, así que no puedo usar la función de señal.

pdfminer.convert_pdf_to_txt() ejecutar el código de conversión con pdfminer.convert_pdf_to_txt() (en mi código es “c”), pero no pude integrar time.time() en el bucle while. Me parece que en el siguiente código, el bucle while y time.time() no funcionan.

En resumen, quiero:

  1. convertir el pdf a txt

  2. el límite de tiempo para cada conversión es de 20 segundos, si se acaba el tiempo, lance una excepción y guarde un archivo vacío

  3. Guarda todos los archivos txt en la misma carpeta

  4. Si hay excepciones / errores, todavía guarde el archivo pero con contenido vacío.

Aquí está el código actual:

 import converter as c import os import timeit import time yourpath = 'D:/hh/' for root, dirs, files in os.walk(yourpath, topdown=False): for name in files: t_end = time.time() +20 try: while time.time()  t_end: print "no" with open("D:/f/"+g+"&"+t+"&"+name+".txt", mode="w") as newfile: newfile.write("") 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("") 

Tienes el enfoque equivocado.

Lo que hace es definir la hora de finalización e ingresar inmediatamente al bucle while si la marca de tiempo actual es inferior a la de la hora de finalización (siempre será True ). Por lo while se ingresa while ciclo while y te quedas atascado en la función de conversión.

Sugeriría el módulo de signal , que ya está incluido en Python. Te permite salir de una función después de n segundos. Un ejemplo básico se puede ver en este StackOverflow anser .

Tu código sería así:

 return astring import converter as c import os import timeit import time import threading import thread yourpath = 'D:/hh/' for root, dirs, files in os.walk(yourpath, topdown=False): for name in files: try: timer = threading.Timer(5.0, thread.interrupt_main) try: c.convert_pdf_to_txt(os.path.join(root, name)) except KeyboardInterrupt: print("no") with open("D:/f/"+g+"&"+t+"&"+name+".txt", mode="w") as newfile: newfile.write("") else: timer.cancel() 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]) print("yes") with open("D:/f/"+g+"&"+t+"&"+name+".txt", mode="w") as newfile: newfile.write(c.convert_pdf_to_txt(os.path.join(root, name))) 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("") 

Realmente espero que esto ayude. Si tiene problemas para comprender los cambios en el código, no dude en preguntar.


Solo para el futuro: 4 espacios de sangría y no demasiado espacio en blanco;)