如何在64位Python中无管理员权限调用32位SAP GUI Scripting API?
64位Python调用SAP GUI Scripting API(无管理员权限解决方案)
你遇到的「Class not registered」错误本质是64位Python进程无法直接加载32位SAP COM组件,但你提到的Excel VBA能无障碍实现的思路完全正确——核心是利用COM Surrogate(由dllhost.exe提供的跨位通信中间层),直接连接已运行的SAP GUI实例,而非尝试加载32位DLL。
关键思路:用GetObject替代Dispatch
你的VBA代码没有用CreateObject而是GetObject,这是破局点:SAP GUI作为正在运行的32位进程,它的COM对象已经注册在系统的**Running Object Table (ROT)**中。我们不需要去注册或加载32位组件,只需要从ROT中直接获取已存在的对象即可,这个过程Windows会自动用COM Surrogate处理跨位通信,完全不需要管理员权限。
64位Python实现代码
直接复刻VBA的逻辑,用win32com.client的GetObject方法即可:
import win32com.client def interact_with_sap(): # 连接到已运行的SAP GUI实例 sap_gui_auto = win32com.client.GetObject("SAPGUI") # 获取SAP脚本引擎 sap_app = sap_gui_auto.GetScriptingEngine() # 获取第一个已连接的系统实例 sap_connection = sap_app.Children(0) # 获取第一个会话窗口 sap_session = sap_connection.Children(0) # 执行事务示例 sap_session.StartTransaction("IH01") if __name__ == "__main__": interact_with_sap()
注意事项
- 确保SAP GUI已经启动并至少有一个已连接的会话,否则
GetObject会抛出「Object not found」错误。 - 确认SAP GUI的脚本功能已启用:在SAP GUI中依次点击
选项→辅助功能与脚本→脚本,勾选「启用脚本」。
内容的提问来源于stack exchange,提问作者Ronan Paixão




