Freitag, Februar 21, 2020

win32com.client.Versand + Cherrypy = CoInitialize wurde nicht aufgerufen

Der folgende code funktioniert gut, aber es scheitert, wenn ausgeführt, eine CherryPy app Methode mit der Fehlermeldung CoInitialize has not been called:

import win32com.client
xl = win32com.client.Dispatch("Excel.Application")
xl.quit()

Dieser Beitrag schlägt vor, eine Lösung, die funktioniert für mich:

import pythoncom
pythoncom.CoInitialize()

Der Grund, warum ich ‚ m Fragen, ein problem, für das ich bereits eine Lösung haben, ist, dass (1) ich würde gerne wissen, was ich Tue (eher als es zu tun nur, weil ich gesehen habe das es funktioniert einmal) und (2) ich möchte nicht riskieren etwas zu verpassen wichtig (und Lesen dieser Beitrag lässt mich denken, dass mir etwas fehlt.)

Konnte ich nicht finden, keine Dokumentation für pythoncom.CoInitialize(), und die Quelle der pythoncom ist die folgenden drei Zeilen, die nicht helfen, mich (noch Eclipse+pydev, die sagt, dass die Methode nicht existiert):

# Magic utility that "redirects" to pythoncomxx.dll
import pywintypes
pywintypes.__import_pywin32_system_module__("pythoncom", globals())
  • Für Dokumente, die auf CoInitialize und anderen COM-Funktionen finden Sie im MSDN
InformationsquelleAutor stenci | 2014-11-04

1 Kommentar

  1. 8

    Ich kann mich nicht genau erinnern, weil ich mir nicht die Arbeit mit COM letzten Jahren, aber ich denke, dass Sie zum initialisieren von COM in jedem thread mit dem Sie arbeiten, es (wieder bin ich mir nicht sicher über jedes COM-Fach). Wie CherryPy ist threaded Server Ihre Anfragen behandelt werden, die durch unterschiedliche threads, nicht bootstrap mit. So schlage ich vor, Sie versuchen das folgende in der bootstrap-routine:

    import pythoncom
    
    
    def onThreadStart(threadIndex):
      pythoncom.CoInitialize()
    
    cherrypy.engine.subscribe('start_thread', onThreadStart)

Kostenlose Online-Tests