CoInitialize Error in Verbindung mit Flask und FEMM

Django, Flask, Bottle, WSGI, CGI…
Antworten
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

Hallo,
ich habe ein Programm geschrieben, welches die FEM-Software FEMM mittels der Bibliothek "pyfemm" ansteuert.
Nun war die Idee, dies nicht nur auf meinem PC zu nutzen, sondern auf einer Webseite für meine Kollegen nutzbar zu machen.
Dazu habe ich in einem anderen Forum den Tipp zu Django und Flask erhalten. Ich habe mich zunächst für Flask entschieden und ein paar Tutorials angeschaut.
Ich wollte jetzt einfach mal probieren, mittels Button auf einer Webseite eine FEMM-Datei zu erstellen. Leider bekomme ich da immer folgenden Fehler:
pywintypes.com_error: (-2147221008, 'CoInitialize wurde nicht aufgerufen.', None, None)

Kann mir da jemand weiter helfen? Vielleicht mache ich ja auch grundlegend etwas falsch oder es ist absolut nicht möglich.

Hier mein Code:

Code: Alles auswählen

import femm
from flask import Flask, render_template, request


app = Flask(__name__)

@app.route("/", methods=['GET','POST'])
def open_femm():
    if request.method == "POST":
        print('Taste gedrueckt!')
        femm_machine = FEMM_Machine()
    return render_template('index.html')

class FEMM_Machine():
    def __init__(self):
        print('Instanz erstellt')
        femm.openfemm()
        femm.mi_saveas('test.fem')
        femm.closefemm()

if __name__ == "__main__":
    app.run(debug=True)
    
Und hier die passende Datei 'index.html' (angelehnt an einen Chat-Messenger aus einem Tutorial):

Code: Alles auswählen

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>
    <style>
        .my-form{
            position: fixed;
            bottom: 24px;
            right: 80px;
            left: 80px;
            width: calc(100% - 160px);
        }
    </style>

</head>
<body>

    <nav class="navbar bg-body-tertiary">
        <div class="container-fluid">
            <a class="navbar-brand" href="#">Button Test</a>
        </div>
    </nav>

    <form class="input-group mb-3 my-form" action="" method="post">
      <input type="text" name="content" class="form-control" placeholder="Nachricht">
      <button class="btn btn-outline-secondary" type="submit" id="button-addon2">Senden</button>
    </form>


</body>
</html>
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

poste mal bitte den vollen Stacktrace der Fehlermeldung, damit man sieht, wo in deinem Code der Fehler auftritt.

Die `open_femm` Route / Funktion ist nicht so richtig gut, weil man als Aufrufer nicht weiß, ob was passiert ist - es wird ja immer das gleiche Template zurück gegeben, auch nach einem Post Request.

Gruß, noisefloor
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

So?

Code: Alles auswählen

127.0.0.1 - - [05/Jan/2024 14:43:05] "POST / HTTP/1.1" 500 -
Traceback (most recent call last):
  File "C:\Users\Schwarz\PycharmProjects\TestOpenFEMM\.venv\lib\site-packages\win32com\client\dynamic.py", line 84, in _GetGoodDispatch
    IDispatch = pythoncom.connect(IDispatch)
pywintypes.com_error: (-2147221008, 'CoInitialize wurde nicht aufgerufen.', None, None)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Schwarz\PycharmProjects\TestOpenFEMM\.venv\lib\site-packages\flask\app.py", line 1478, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\Schwarz\PycharmProjects\TestOpenFEMM\.venv\lib\site-packages\flask\app.py", line 1458, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\Schwarz\PycharmProjects\TestOpenFEMM\.venv\lib\site-packages\flask\app.py", line 1455, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\Schwarz\PycharmProjects\TestOpenFEMM\.venv\lib\site-packages\flask\app.py", line 869, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\Schwarz\PycharmProjects\TestOpenFEMM\.venv\lib\site-packages\flask\app.py", line 867, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\Schwarz\PycharmProjects\TestOpenFEMM\.venv\lib\site-packages\flask\app.py", line 852, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
  File "C:\Users\Schwarz\PycharmProjects\TestOpenFEMM\open_femm.py", line 12, in open_femm
    femm_machine = FEMM_Machine()
  File "C:\Users\Schwarz\PycharmProjects\TestOpenFEMM\open_femm.py", line 18, in __init__
    femm.openfemm()
  File "C:\Users\Schwarz\PycharmProjects\TestOpenFEMM\.venv\lib\site-packages\femm\__init__.py", line 25, in openfemm
    HandleToFEMM = win32com.client.Dispatch( "femm.ActiveFEMM")
  File "C:\Users\Schwarz\PycharmProjects\TestOpenFEMM\.venv\lib\site-packages\win32com\client\__init__.py", line 118, in Dispatch
    dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch, userName, clsctx)
  File "C:\Users\Schwarz\PycharmProjects\TestOpenFEMM\.venv\lib\site-packages\win32com\client\dynamic.py", line 104, in _GetGoodDispatchAndUserName
    return (_GetGoodDispatch(IDispatch, clsctx), userName)
  File "C:\Users\Schwarz\PycharmProjects\TestOpenFEMM\.venv\lib\site-packages\win32com\client\dynamic.py", line 86, in _GetGoodDispatch
    IDispatch = pythoncom.CoCreateInstance(
pywintypes.com_error: (-2147221008, 'CoInitialize wurde nicht aufgerufen.', None, None)
127.0.0.1 - - [05/Jan/2024 14:43:05] "GET /?__debugger__=yes&cmd=resource&f=debugger.js HTTP/1.1" 304 -
127.0.0.1 - - [05/Jan/2024 14:43:05] "GET /?__debugger__=yes&cmd=resource&f=style.css HTTP/1.1" 304 -
127.0.0.1 - - [05/Jan/2024 14:43:05] "GET /?__debugger__=yes&cmd=resource&f=console.png HTTP/1.1" 304 -
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`CoInitialise()` muss von Threads aus aufgerufen werden, bevor man mit `pythoncom` Aufrufe in dem jeweiligen Thread macht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wobei sich dann ja auch die Frage stellt, ob und wie pyfemm mit mehreren Threads umgeht, oder ob es nicht besser waere, da eine dedizierten Worker-Thread anzulegen.
Patrick1990
User
Beiträge: 116
Registriert: Freitag 3. Juni 2016, 05:45

Ich habe jetzt mal in die Datei "dynamic.py" die Zeile

Code: Alles auswählen

pythoncom.CoInitialize()
eingefügt. Scheint erstmal zu funktionieren. Ich werde das jetzt mal etwas testen und mich melden.

Vielen Dank erstmal :)
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Patrick1990: Das ist aber eher unschön in fremden, installierten Bibliotheken Code zu verändern, und das ist ja dann auch jedes mal weg wenn man das neu installiert oder aktualisiert. Und dann ist da noch die berechtigte Frage von __deets__ ob die Bibliothek überhaupt „thread safe“ ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten