首页 > 解决方案 > 尝试从 Django 视图中使用 win32com.client 获取 COM 对象时出现 com_error

问题描述

我正在尝试将 SAP GUI 会话连接到我的 Django 项目,以便我可以与它交互,方法是使用 win32com.client 处理 COM 对象。在 shell 中工作时,我完全可以通过运行以下代码来完成这项工作:

sap_gui = win32com.client.GetObject("SAPGUI")
application = sap_gui.GetScriptingEngine
connection = application.Children(0)
session = connection.Children(0)

如果我在views.pyDjango 模块中使用此代码启动服务器,这也可以,我可以在我的 Django 视图中显示会话信息。但是,我希望能够手动连接和断开此类会话,因为不同的用户将需要连接到不同的会话,并且通过在启动时运行代码我只能坚持第一个会话。

我一直试图通过在views.py中定义以下视图来实现这一点:

def dashboard(request):
  if request.method == 'POST' and 'SAP_button' in request.POST:
    # Get the COM object (SAP session in this case)
    sap_gui = win32com.client.GetObject("SAPGUI") # ERROR HERE
    application = sap_gui.GetScriptingEngine
    connection = application.Children(0)
    session = connection.Children(0)
    # This is just a test to see if I get the desired output from the COM object
    test = session.info.User
  return render(request, 'Users/dashboard.html', {'test': test})

表单 ('Users/dashboard.html') 对应的 html 代码如下:

<form action="", method="POST">{% csrf_token %}
    <button type="submit", name="SAP_button">Connect SAP</button>
</form>

单击按钮时,请求按预期工作,但我得到以下信息com_error(-2147221020, 'Invalid syntax', None, None)。此错误来自尝试获取 SAP COM 对象时的第一行:sap_gui = win32com.client.GetObject("SAPGUI").

看起来从视图运行的代码无法访问 COM 对象,但我对 Django 还是很陌生,甚至研究此类错误我也无法理解为什么会发生这种情况或可能的解决方案/解决方法。任何帮助表示赞赏。

标签: pythonhtmldjangowin32comsap-gui

解决方案


经过更多研究后,我最终找到了解决此问题的代码。在 POST 请求之后,Django 视图在不同的线程中运行,因此需要为此类线程初始化 COM 库。我通过在获取 COMobject 之前添加以下代码行解决了这个问题:

import pythoncom
...
pythoncom.CoInitialize()
sap_gui = win32com.client.GetObject("SAPGUI") # ERROR SOLVED
...

推荐阅读