【问题标题】:AttributeError: Word.Application.Documents with win32.com in a Flask applicationAttributeError:在 Flask 应用程序中带有 win32.com 的 Word.Application.Documents
【发布时间】:2019-08-06 08:07:11
【问题描述】:

我正在开发一个使用 word 文件并执行标记化的 Web 应用程序。 我注意到文档从 angularJS 正确传递到了 Flask,但是有一个我无法解释的错误:

Traceback (most recent call last):
  File "C:\Users\AOUP\MiniAnaconda\lib\site-packages\flask\app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\AOUP\MiniAnaconda\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\AOUP\MiniAnaconda\lib\site-packages\flask\app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\AOUP\MiniAnaconda\lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\AOUP\MiniAnaconda\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\AOUP\MiniAnaconda\lib\site-packages\flask\app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "app.py", line 43, in tokenizer
    myDoc = word.Documents.Open(pathToProc, False, False, True) #stackoverflow
  File "C:\Users\AOUP\MiniAnaconda\lib\site-packages\win32com\client\dynamic.py", line 527, in __getattr__
    raise AttributeError("%s.%s" % (self._username_, attr))
AttributeError: Word.Application.Documents

文档由angularJS传递,代码如下:

var f = document.getElementsByTagName("form")[0].children[1].files[0].name;
if (f != ""){
    $http({
        url: '/tokenizeDoc', 
        method: "GET",
        params: {doc : f}
    });
}

随后 Flask 使用以下脚本读取它,错误落在带有错误注释的行中:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import string
import win32com.client
import nltk
import os
from collections import Counter
from pywintypes import com_error
from flask import request, Flask, render_template, jsonify

word = win32com.client.Dispatch("Word.Application")
word.Visible = False

app = Flask(__name__)
@app.route('/')
def landingPage():
    return render_template('homepage.html')

@app.route('/tokenizeDoc', methods = ['GET'])
def tokenizer():
    if request.method == 'GET':
        pathToProc = request.values.get("doc")
        sent_tokenizer = nltk.data.load('tokenizers/punkt/italian.pickle')
        it_stop_words = nltk.corpus.stopwords.words('italian') + ['\n', '\t', '']
        trashes = it_stop_words + list(string.punctuation)
        tokensTOT = []
        try:
            myDoc = word.Documents.Open(pathToProc, False, False, True) #ERROR!!!
            sentences = sent_tokenizer.tokenize(word.ActiveDocument.Range().Text)
            myDoc.Close()
            del myDoc
            for sentence in sentences:
                tokensTOT = tokensTOT + [t.lower() for t in nltk.word_tokenize(sentence) 
                                         if t.lower() not in trashes]
        except com_error:
            print('IMPOSSIBILE DECIFRARE IL FILE')
        return ''

希望win32com库与web框架不兼容,有人可以给我解答。

非常感谢。

【问题讨论】:

  • 没有突出显示的行。您能否也包括异常消息
  • 我输入了完整的回溯并放了评论,而不是突出显示
  • 您能否还包括定义word 的位置
  • 我放了整个脚本
  • @jan-seins 如果您对此有所了解,请告诉我...

标签: angularjs python-3.x flask win32com


【解决方案1】:

使用os.path.abspath(pathToProc) 代替pathToProc myDoc = word.Documents.Open(pathToProc, False, False, True) #ERROR!!!

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。 我设法应用的唯一解决方案是为view 函数的每次调用单独执行win32com.client.Dispatch

    您还需要执行pythoncom.CoInitialize() 才能正常工作的烧瓶多线程

    import pythoncom
    import win32com.client
    
    
    def get_word_instance():
        pythoncom.CoInitialize()
        return win32com.client.Dispatch("Word.Application")
    
    
    @app.route('/tokenizeDoc', methods=['GET'])
    def tokenizer():
        word = get_word_instance()
        word.visible = False
    
    

    COM 对象的创建实例可能是一个资源密集型过程。如果您在处理 COM 对象时需要更高的性能,那么您可能需要考虑禁用 Flask 应用程序的多线程的选项。

    app.run(threaded=False)
    

    那么你就可以直接使用你的代码了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-11
      • 2020-11-14
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多