Как импортировать панд в COM-объект Python для VBA - PullRequest
0 голосов
/ 07 февраля 2019

Я должен передать данные из VBA в Python и обратно.

Мне также нужен Python Obj в VBA для использования библиотеки Pandas (и других библиотек, таких как numpy, ...).

  • Я успешно использовал РЕШЕНИЕ 2, предоставленное Флоран Б. : Перемещение массивов numpy из VBA в Python и обратно
  • Если я вообще не пытаюсь импортировать панд, Объект успешно создан и работает нормально(но панды не используются).Любой VBA-массив, переданный объекту Python t, распознается как кортеж кортежей
  • Мне нужно преобразовать ввод данных (кортеж кортежей) в панды DataFrames.Поэтому в файле MyLibrary.py я затем добавил «панд» в список импорта (в верхней части файла - см. Код Python ниже)
  • Затем я успешно зарегистрировал модуль (с пандами) в оболочке Python

В VBA, когда объект создается ...

Set Py = CreateObject("Python.MyModule")

... Я получаю сообщение об ошибке, связанное с:

returnretObj. CreateInstance (clsid, reqID)

АЛЬТЕРНАТИВНО ...

  • Если я импортирую панд изв MyFunction (без объявления в верхней части файла) объект Python создается успешно (так импортируется pandas из MyFunction в Python):

    def MyFunction(self, data) :
    import pandas
    
  • , но когда явызвать MyFunction из VBA (то есть, когда pandas импортируется) ...

    ArrayOutput = Py.MyFunction(ArrayInput)
    

    ... Я получаю сообщение об ошибке:

    return self._invoke (dispid, lcid, wFlags, args)

Код приведен ниже (я сообщаю версию, в которой панды импортируются вверху файла):

Код VBA:

Sub UsePythonObj(ArrayInput)

''''''''''''''''''''''''''''''
' Create Python Object
Dim ArrayOutput As Variant
Dim Py As Object
Set Py = CreateObject("Python.MyModule")


''''''''''''''''''''''''''''''''''''''
' Run Python 
ArrayOutput = Py.MyFunction(ArrayInput)

End Sub

Код Python:

import sys, os, win32api, win32com.server.localserver, win32com.server.register, pandas

    class MyModule(object):


      _reg_clsid_ = "{5B4A4174-EE23-4B70-99F9-E57958CFE3DF}"
      _reg_desc_ = "My Python COM Server"
      _reg_progid_ = "Python.MyModule"
      _public_methods_ = ['MyFunction']


      def MyFunction(self, data) :
          ProcessingData = pandas.DataFrame(list(data))
          return ProcessingData


    def register(*classes) :
      regsz = lambda key, val: win32api.RegSetValue(-2147483647, key, 1, val)
      isPy = not sys.argv[0].lower().endswith('.exe')
      python_path = isPy and win32com.server.register._find_localserver_exe(1)
      server_path = isPy and win32com.server.register._find_localserver_module()

      for cls in classes :
        if isPy :
          file_path = sys.modules[cls.__module__].__file__
          class_name = '%s.%s' % (os.path.splitext(os.path.basename(file_path))[0], cls.__name__)
          command = '"%s" "%s" %s' % (python_path, server_path, cls._reg_clsid_)
        else :
          file_path = sys.argv[0]
          class_name = '%s.%s' % (cls.__module__, cls.__name__)
          command = '"%s" %s' % (file_path, cls._reg_clsid_)

        regsz("SOFTWARE\\Classes\\" + cls._reg_progid_ + '\\CLSID', cls._reg_clsid_)
        regsz("SOFTWARE\\Classes\\AppID\\" + cls._reg_clsid_, cls._reg_progid_)
        regsz("SOFTWARE\\Classes\\CLSID\\" + cls._reg_clsid_, cls._reg_desc_)
        regsz("SOFTWARE\\Classes\\CLSID\\" + cls._reg_clsid_ + '\\LocalServer32', command)
        regsz("SOFTWARE\\Classes\\CLSID\\" + cls._reg_clsid_ + '\\ProgID', cls._reg_progid_)
        regsz("SOFTWARE\\Classes\\CLSID\\" + cls._reg_clsid_ + '\\PythonCOM', class_name)
        regsz("SOFTWARE\\Classes\\CLSID\\" + cls._reg_clsid_ + '\\PythonCOMPath', os.path.dirname(file_path))
        regsz("SOFTWARE\\Classes\\CLSID\\" + cls._reg_clsid_ + '\\Debugging', "0")

        print('Registered ' + cls._reg_progid_)


    if __name__ == "__main__":
      if len(sys.argv) > 1 :
        win32com.server.localserver.serve(set([v for v in sys.argv if v[0] == '{']))
      else :
        register(MyModule)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...