小码问答,有问必答!

2021-07-20 14:00

使用win32com.client创建快捷方式本地测试没问题,使用Flask远程请求就报错,什么问题?

牛叔叔 2021-07-20 14:00 回答了这个问题

Python

import os
import win32com.client as client
from flask import Flask
from flask import request
app = Flask(__name__)
shell = client.Dispatch("WScript.Shell")

@app.route('/')
def getShortCut():
    #filename = request.values.get('filename')
    #filename = filename.replace('/', '//')
    #lnkname = filename.split('//')[-1].split('.')[0] + '.lnk'
    filename = 'D://eclipse//eclipse.exe'
    lnkname = 'd://eclipse//eclipse2021.lnk'
    print(filename)
    print(lnkname)
    createShortCut(filename, lnkname)
    return "<h1>Sucess!</h1>"


def createShortCut(filename, lnkname):
    """filename should be abspath, or there will be some strange errors"""
    filename = os.path.abspath(filename)
    shortcut = shell.CreateShortCut(lnkname)
    shortcut.TargetPath = filename
    shortcut.save()
    return os.path.abspath(lnkname)

    
if __name__ == "__main__":
    app.run()

运行之后请求报错:

[2021-07-20 13:48:30,177] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
  File "D:\pythonworks\wmpythondemo\lib\site-packages\flask\app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "D:\pythonworks\wmpythondemo\lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "D:\pythonworks\wmpythondemo\lib\site-packages\flask\app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "D:\pythonworks\wmpythondemo\lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "D:\pythonworks\wmpythondemo\lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "D:\pythonworks\wmpythondemo\lib\site-packages\flask\app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "D:/pythonworks/wmpythondemo/win32/win32demo.py", line 20, in getShortCut
    createShortCut(filename, lnkname)
  File "D:/pythonworks/wmpythondemo/win32/win32demo.py", line 27, in createShortCut
    shortcut = shell.CreateShortCut(lnkname)
  File "<COMObject WScript.Shell>", line 2, in CreateShortCut
pywintypes.com_error: (-2147352567, '发生意外。', (0, None, None, None, 0, -2147221008), None)
127.0.0.1 - - [20/Jul/2021 13:48:30] "GET / HTTP/1.1" 500 -


可以通过:

import win32api
print(win32api.FormatMessage(-2147221008))

来查看具体错误信息为:

尚未调用 CoInitialize。


这是由于多线程使用pywin32com造成的问题。

只要在线程启动时先运行pythoncom.CoInitialize()就没有问题了。

在代码中可以使用:

import pythoncom

#省略原代码。。。

@app.route('/')
def getShortCut():
    #filename = request.values.get('filename')
    #filename = filename.replace('/', '//')
    #lnkname = filename.split('//')[-1].split('.')[0] + '.lnk'
    pythoncom.CoInitialize()
    filename = 'D://eclipse//eclipse.exe'
    lnkname = 'd://eclipse//eclipse2021.lnk'
    print(filename)
    print(lnkname)
    createShortCut(filename, lnkname)
    return "<h1>sucess!</h1>"



0条评论

我要评论