在Python Rpyc Server上初始化COM对象并重新使用它?

时间:2018-07-19 17:26:37

标签: python win32com rpyc

我正在使用rpyc python服务器处理通过电子邮件发送的请求。我正在将它们加载到Excel吸盘中,其想法是在收到新请求后通过运行宏来自动更新excel。

但是,我无法初始化工作簿对象。下面的代码可以正常打开工作簿(startExcel),但是当我运行RunThis方法时,它会打印0,因为尚未初始化工作簿中的代码。

有什么办法可以解决这个问题吗?

from threading import Thread, Lock
import rpyc
from rpyc.utils.server import ThreadedServer
import win32com.client
from win32com.client import DispatchEx
import pythoncom
import os
import time


class MyService(rpyc.Service):

    excelInitialized = False
    xl = 0
    wb = 0

    def exposed_startExcel(self):

        pythoncom.CoInitialize()

        xl, wb = loadExcelEnv()
        print wb
        ws = wb.Sheets('RequestBlotter')
        xl.Application.Run("ThisWorkbook.cleardata")
        xl.Application.Run("ThisWorkbook.UpdateBlotter")

    def exposed_RunThis(self):
        print self.wb


def loadExcelEnv():

    xl = DispatchEx('Excel.Application')
    xl.DisplayAlerts = True
    xl.Visible = True

    wb = xl.Workbooks.Open(dir_path + '\\Repo Blotter.xlsm')

    return xl, wb

server = ThreadedServer(MyService, port = 33445, protocol_config = {"allow_public_attrs" : True})
dir_path = os.path.dirname(os.path.realpath(__file__))


t = Thread(target = server.start)
t.daemon = True

t.start()

conn = rpyc.connect("localhost", 33445)
c = conn.root
c.startExcel()

while True:
    time.sleep(10)
    c.exposed_RunThis()

1 个答案:

答案 0 :(得分:0)

MyService.exposed_startExcel中,变量wb的范围是方法;您永远不会设置属性MyService.wb。为此,请设置self.wb而不是wb