You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多进程操作SAP GUI遇PyIDispatch对象无法pickle问题求助

解决SAP GUI多进程pickle PyIDispatch对象失败的问题

核心思路

别在主进程创建SAP GUI会话后传给子进程,改成让每个子进程独立完成SAP GUI连接、会话创建、事务执行的全流程。因为win32com.client.CDispatch这类COM对象本身无法被序列化(pickle),跨进程传递必然报错。

具体实现步骤

  • 重构sap_novo模块,封装独立的事务执行函数,把从启动SAP到提取数据的逻辑都放在函数内部:
    # sap_novo.py
    import win32com.client
    
    def run_sap_transaction(transaction_code, login_params):
        # 初始化SAP GUI连接与会话
        sap_gui_auto = win32com.client.GetObject("SAPGUI")
        if not sap_gui_auto:
            sap_gui_auto = win32com.client.Dispatch("SAPGUI")
        application = sap_gui_auto.GetScriptingEngine
        connection = application.OpenConnection(login_params["system"], True)
        session = connection.Children(0)
    
        # 登录操作(如果未自动登录)
        session.findById("wnd[0]/usr/txtRSYST-BNAME").text = login_params["user"]
        session.findById("wnd[0]/usr/pwdRSYST-BCODE").text = login_params["password"]
        session.findById("wnd[0]/usr/txtRSYST-LANGU").text = login_params["lang"]
        session.findById("wnd[0]").sendVKey(0)
    
        # 执行目标事务
        session.findById("wnd[0]/tbar[0]/okcd").text = transaction_code
        session.findById("wnd[0]").sendVKey(0)
    
        # 这里添加对应事务的数据提取逻辑,根据CX34/FS10N的界面元素定位抓取数据
        extracted_data = ...
    
        # 关闭会话(可选,按需保留连接)
        session.findById("wnd[0]").sendVKey(15)
        connection.CloseConnection(0)
    
        return extracted_data
    
  • 在main.py中用多进程调用上述函数,每个进程处理一个事务:
    # main.py
    import multiprocessing
    from sap_novo import run_sap_transaction
    
    if __name__ == "__main__":
        # 实际环境的登录参数
        login_info = {
            "system": "你的SAP系统标识",
            "user": "登录账号",
            "password": "登录密码",
            "lang": "ZH"
        }
    
        # 要并行执行的事务列表
        task_list = [("CX34", login_info), ("FS10N", login_info)]
    
        # 启动进程池执行任务
        with multiprocessing.Pool(processes=2) as pool:
            results = pool.starmap(run_sap_transaction, task_list)
    
        # 处理返回的数据
        cx34_result, fs10n_result = results
        # 后续数据保存/处理逻辑
        ...
    

额外注意事项

  • 确保SAP GUI脚本功能已开启:打开SAP GUI→选项→脚本设置,勾选“启用脚本”和“允许远程控制”。
  • 每个子进程必须完全独立初始化连接,绝对不能共享任何COM对象实例。
  • 如果想减少重复登录的耗时,可以让子进程保持连接,但要确保每个进程的会话独立,避免资源冲突。

内容的提问来源于stack exchange,提问作者Luiz Carlos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:20:05