Win32Com Python использует один глобальный экземпляр Dispatcher для создания нескольких объектов рабочей книги в Flask - PullRequest
1 голос
/ 06 марта 2020

Вот код того, что я пытаюсь реализовать

from flask import Flask, request, jsonify
import json   
import pythoncom
import win32com.client
from win32com.client import Dispatch

xl = None
xl = win32com.client.Dispatch("Excel.Application")

app = Flask(__name__)


@app.route("/check", methods=['POST'])
def check():

    pythoncom.CoInitialize()
    if request.method == 'POST':
        data = request.get_json()
        fname = data['fname']
        phName = data['PH_Name']
        liName = data['LI_NAME']
        ppm = data['PPM']
        policyTerm = data['Policy_Term']
        sumAssured = data['Sum_Assured']


        wb = None

        if xl : 
            wb = xl.Workbooks.Open(fname) 


            inp_sheet = wb.Sheets["Inputs"]

            #read data from sheet
            data = inp_sheet.Range('D8').Value


            wb.Close(False)
            xl.Quit()
            return (data)


if __name__ == '__main__':
    app.run(threaded=True, port=5001, debug=True)

Проблема в том, что win32com создает новые потоки всякий раз, когда функция flask используется для открытия книги, и, следовательно, требует, чтобы маршал объекта Dispatcher поток, чтобы передать его функции. Как мне сделать это для вызова API?

Я нашел несколько предложений, используя CoMarshalInterThreadInterfaceInStream и CoGetInterfaceAndReleaseStream, но они не запускаются, когда к API делается несколько параллельных вызовов.

...