我正在尝试在IIS Web服务器上部署Python应用程序,每当遇到使用win32com对象的代码时,它会抛出错误,但代码在Python内置Web服务器上运行良好。
Excel应用程序
下面是错误:
xlapp undefined, global win32com = <module 'win32com' from 'C:\Python27\lib\site-packages\win32com\__init__.pyc'>, win32com.client = <module 'win32com.client' from 'C:\Python27\lib\site-packages\win32com\client\__init__.pyc'>, win32com.client.Dispatch = <function Dispatch>
C:\Python27\lib\site-packages\win32com\client\__init__.py in Dispatch(dispatch='Excel.Application', userName=None, resultCLSID=None, typeinfo=None, UnicodeToString=None, clsctx=21)
93 """
94 assert UnicodeToString is None, "this is deprecated and will go away"
=> 95 dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)
96 return __WrapDispatch(dispatch, userName, resultCLSID, typeinfo, clsctx=clsctx)
97
dispatch = 'Excel.Application', userName = None, global dynamic = <module 'win32com.client.dynamic' from 'C:\Python27\lib\site-packages\win32com\client\dynamic.pyc'>, dynamic._GetGoodDispatchAndUserName = <function _GetGoodDispatchAndUserName>, clsctx = 21
C:\Python27\lib\site-packages\win32com\client\dynamic.py in _GetGoodDispatchAndUserName(IDispatch='Excel.Application', userName='Excel.Application', clsctx=21)
113 else:
114 userName = str(userName)
=> 115 return (_GetGoodDispatch(IDispatch, clsctx), userName)
116
117 def _GetDescInvokeType(entry, default_invoke_type):
global _GetGoodDispatch = <function _GetGoodDispatch>, IDispatch = 'Excel.Application', clsctx = 21, userName = 'Excel.Application'
C:\Python27\lib\site-packages\win32com\client\dynamic.py in _GetGoodDispatch(IDispatch='Excel.Application', clsctx=21)
90 IDispatch = pythoncom.connect(IDispatch)
91 except pythoncom.ole_error:
=> 92 IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
93 else:
94 # may already be a wrapped class.
IDispatch = 'Excel.Application', global pythoncom = <module 'pythoncom' from 'C:\windows\system32\pythoncom27.dll'>, pythoncom.CoCreateInstance = <built-in function CoCreateInstance>, builtin None = None, clsctx = 21, pythoncom.IID_IDispatch = IID('{00020400-0000-0000-C000-000000000046}')
<class 'pywintypes.com_error'>:(-2147024891, 'Access is denied.', None, None)
argerror = None
args = (-2147024891, 'Access is denied.', None, None)
excepinfo = None
hresult = -2147024891
message = ''
strerror = 'Access is denied.'
1条答案
按热度按时间os8fio9y1#
错误消息中包含线索:
〈class 'pywintypes.com_error'〉:(-2147024891,'访问被拒绝。',无,无)
参数错误=无
args =(-2147024891,'访问被拒绝。',无,无)
例外信息=无
h结果= -2147024891
消息=“”
strerror = '访问被拒绝。'
您运行python应用所用的身份似乎没有启动Excel示例的权限。
更新日期:
Excel将作为进程外COM服务器启动。若要允许您的网站权限启动Excel并将对象示例化为工作簿,您需要使用名为 dcomcnfg.exe 的工具为Excel配置 * 启动和激活 * 权限。
您可以从开始-〉运行或从命令行启动 * dcomcnfg.exe *。您还需要是本地计算机管理员。
启动后,展开 * 组件服务 * 节点及其子节点,如下面的屏幕截图所示:
向下滚动浏览 DCOM Config 节点的子节点,直到找到名为 Microsoft Excel Application 的条目:
右键单击此条目并选择 * 属性 *,将打开一个选项卡对话框。选择 * 安全 * 选项卡,然后选择启动和激活权限 * 自定义 * 单选按钮,然后单击 * 编辑 * 按钮,如下所示:
当您点击 * 编辑 * 按钮时,将打开另一个对话框,在此窗口中,您可以添加您的网站运行所用的身份:
通常,站点将在Application Pool Identity下运行,它通常与站点的应用程序池同名(除非您更改了它)。
您需要将启动和激活权限都授予池标识。单击 * 添加 * 按钮可执行此操作,此时将显示:
x1c4d 1x指令集
在文本框中输入以
IIS AppPool\
为前缀的池标识(空格和反斜杠很重要:例如:
单击“确定”,您将看到您的应用程序池标识添加到用户列表中。然后,确保选中了 * 本地启动 * 和 * 本地激活 * 允许复选框,如下所示:
指令集
完成后,单击“确定”,然后再次单击“确定”。
希望现在你应该能够让你的Python应用程序启动Excel。
我应该提醒你,Excel(和其他Office套件应用程序)不是为在Web应用程序中使用而设计(或授权)的。最终可能会有数百个孤立的Excel(或Word)进程,这将成为一个全面的管理/资源占用噩梦。