V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JerryV2
V2EX  ›  Flask

Flask 通过 win32com 调用 Word 失败,求助

  •  
  •   JerryV2 · 2019-01-06 22:19:25 +08:00 · 5691 次点击
    这是一个创建于 2139 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,目的是通过 Flask 获取 Word 文件内容,格式可能是 .doc 或者 .docx

    在 Flask 内通过 win32com 调用 Word 就会失败,不通过 Flask 就能正常调用。

    应该是权限的原因吧? 应该怎么办?

    第一次用 Flask,请大神轻拍~

    第 1 条附言  ·  2019-01-07 09:32:12 +08:00
    代码:



    错误信息


    File "C:\Python33\lib\site-packages\win32com\client\dynamic.py", line 91, in _GetGoodDispatch
    IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
    pywintypes.com_error: (-2147221008, '尚未调用 CoInitialize。', None, None)
    127.0.0.1 - - [07/Jan/2019 09:29:56] "GET /DocText/?file=F:\Eclipse%E5%85%B3%E9%94%AE%E5%AD%97.doc HTTP/1.1" 500 -
    第 2 条附言  ·  2019-01-07 16:21:20 +08:00
    问题已经解决了,在此总结一下

    问题的原因是 COM 初始化失败,有两种解决方法:


    1、最简洁的方法是 @ysc3839 提供的,在脚本开头添加一下脚本:

    import sys
    sys.coinit_flags = 0

    完整源码:




    2、或者在脚本开头添加:

    import pythoncom

    然后在 COM 调用函数内,添加:

    pythoncom.CoInitialize()

    完整源码:




    再次感谢各位的帮助!
    第 3 条附言  ·  2019-01-07 16:26:09 +08:00
    上面第二段代码贴错了
    在 import pythoncom 后立即调用 pythoncom.CoInitialize() 是不起作用的,还是提示 “尚未调用 CoInitialize ”


    应该是这样:

    JerryV2
        1
    JerryV2  
    OP
       2019-01-06 22:22:50 +08:00
    @loading
    https://www.v2ex.com/t/103107

    看到你之前做过,还请不吝赐教,多谢
    cz5424
        2
    cz5424  
       2019-01-06 22:25:17 +08:00 via iPhone
    发一下代码看看,单凭你描述解决不了问题
    ysc3839
        3
    ysc3839  
       2019-01-07 00:45:04 +08:00
    “在 Flask 内通过 win32com 调用 Word 就会失败”,起码说一下怎么个失败吧?
    loading
        4
    loading  
       2019-01-07 06:51:28 +08:00 via Android
    @JerryV2 我按你描述的方法写没问题。

    还是上次我的回复:


    没代码,靠猜?
    JerryV2
        5
    JerryV2  
    OP
       2019-01-07 09:20:58 +08:00
    代码:

    https://gist.github.com/xuqiang1015/e7f3480a2f5b7b9de30e2b9a44dc9687

    昨天贴代码没贴上,系统怀疑我在做推广 orz
    JerryV2
        6
    JerryV2  
    OP
       2019-01-07 09:30:33 +08:00
    错误信息:

    File "C:\Python33\lib\site-packages\win32com\client\dynamic.py", line 91, in _GetGoodDispatch
    IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
    pywintypes.com_error: (-2147221008, '尚未调用 CoInitialize。', None, None)
    127.0.0.1 - - [07/Jan/2019 09:29:56] "GET /DocText/?file=F:\Eclipse%E5%85%B3%E9%94%AE%E5%AD%97.doc HTTP/1.1" 500 -
    julyclyde
        7
    julyclyde  
       2019-01-07 10:05:48 +08:00
    随便一搜错误信息不就能找到答案么?你这动手能力太差了吧
    JerryV2
        8
    JerryV2  
    OP
       2019-01-07 10:10:26 +08:00
    @julyclyde

    并没有随便一搜就找到答案,试过手动初始化 COM,并没有解决问题
    julyclyde
        9
    julyclyde  
       2019-01-07 10:15:47 +08:00
    @JerryV2 也许你用的搜索引擎和我不一样吧

    试过手工初始化并没有解决问题,你至少得发一下这个做法之后有什么进展吧
    JerryV2
        10
    JerryV2  
    OP
       2019-01-07 10:17:18 +08:00


    pythoncom.CoInitialize()

    放到 ReadDocText 函数内可以了,之前放在函数外面不可以

    @julyclyde
    julyclyde
        11
    julyclyde  
       2019-01-07 10:20:34 +08:00
    @JerryV2 之前把 CoInitialize 放在函数外边不可以,是具体放在了哪个位置?
    JerryV2
        14
    JerryV2  
    OP
       2019-01-07 10:31:46 +08:00
    在此声明一下,我不是伸手党啊, 确实去 Google 了,但是没想到 COM 初始化的位置还会有影响,等有时间研究一下这背后的区别吧,或者哪位大神愿意解答一下,在此先表示感谢
    julyclyde
        15
    julyclyde  
       2019-01-07 10:49:56 +08:00
    你启动程序的时候是用 app.run 这段启动的,还是另外用了 gunicorn、uwsgi 之类的来启动的呢?
    JerryV2
        16
    JerryV2  
    OP
       2019-01-07 10:57:22 +08:00
    @julyclyde
    通过 app.run 启动的,我贴的源码就是全部源码,通过 VSCode 调试启动
    julyclyde
        17
    julyclyde  
       2019-01-07 11:08:57 +08:00
    @JerryV2 我建议手工启动一下试试。调试启动不知道是不是环境不干净
    ysc3839
        18
    ysc3839  
       2019-01-07 15:20:16 +08:00   ❤️ 1
    试试在文件最开头加上

    import sys
    sys.coinit_flags = 0
    JerryV2
        19
    JerryV2  
    OP
       2019-01-07 16:14:55 +08:00
    @ysc3839

    果然可以,厉害了!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3157 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:39 · PVG 08:39 · LAX 16:39 · JFK 19:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.