Python win32com.client.Dispatch przechodzący przez dokumenty Worda i eksportujący do PDF; kończy się niepowodzeniem przy następnej pętli

Na podstawie tego skryptu:.doc do pdf przy użyciu Pythona Mam pół-roboczy skrypt do eksportowania plików .docx do pdf z C: Export_to_pdf do nowego folderu.

Problem polega na tym, że przechodzi przez pierwszą parę dokumentów, a następnie kończy się niepowodzeniem:

(-2147352567, 'Exception occurred.', (0, u'Microsoft Word', u'Command failed', u'wdmain11.chm', 36966, -2146824090), None)

To najwyraźniej nie jest pomocny ogólny komunikat o błędzie. Jeśli powoli debuguję za pomocą pdb, mogę przechodzić przez wszystkie pliki i pomyślnie eksportować. Jeśli mam również na oku procesy w Menedżerze zadań Windows, widzę, że WINWORD zaczyna się wtedy kończyć, kiedy ma, ale na większych plikach użycie pamięci trwa dłużej. To sprawia, że ​​myślę, że skrypt potknie się, gdy WINWORD nie ma czasu na inicjalizację lub zamknięcie przed wywołaniem następnej metody w obiekcie client.Dispatch.

Czy w przypadku win32com lub comtypes jest sposób na identyfikację i oczekiwanie na rozpoczęcie lub zakończenie procesu?

Mój skrypt:

import os
from win32com import client

folder = "C:\\Export_to_pdf"
file_type = 'docx'
out_folder = folder + "\\PDF"

os.chdir(folder)

if not os.path.exists(out_folder):
    print 'Creating output folder...'
    os.makedirs(out_folder)
    print out_folder, 'created.'
else:
    print out_folder, 'already exists.\n'

for files in os.listdir("."):
    if files.endswith(".docx"):
        print files

print '\n\n'

try:
    for files in os.listdir("."):
        if files.endswith(".docx"):
            out_name = files.replace(file_type, r"pdf")
            in_file = os.path.abspath(folder + "\\" + files)
            out_file = os.path.abspath(out_folder + "\\" + out_name)
            word = client.Dispatch("Word.Application")
            doc = word.Documents.Open(in_file)
            print 'Exporting', out_file
            doc.SaveAs(out_file, FileFormat=17)
            doc.Close()
            word.Quit()
except Exception, e:
    print e

Działający kod - właśnie zastąpił ten blok try. Notatka przeniosła instrukcję DispatchEx poza pętlę for i word.Quit () do instrukcji finally, aby zapewnić jej zamknięcie.

try:
    word = client.DispatchEx("Word.Application")
    for files in os.listdir("."):
        if files.endswith(".docx") or files.endswith('doc'):
            out_name = files.replace(file_type, r"pdf")
            in_file = os.path.abspath(folder + "\\" + files)
            out_file = os.path.abspath(out_folder + "\\" + out_name)
            doc = word.Documents.Open(in_file)
            print 'Exporting', out_file
            doc.SaveAs(out_file, FileFormat=17)
            doc.Close()
except Exception, e:
    print e
finally:
    word.Quit()

questionAnswers(1)

yourAnswerToTheQuestion