![](/img/trans.png)
[英]error msg in VBA when calling a COM server created in Python using Win32
[英]Access VBA <-win32 com server-> python script
我已將示例代碼https://inneka.com/programming/vba/moving-numpy-arrays-from-vba-to-python-and-back/ (解決方案 2)復制到 VBA Sub 和 VBA Sub 和 VBA Sub 和 VBA Sub 和 VBA 腳本。
import sys, os, win32api, win32com.server.localserver, win32com.server.register
import numpy as np
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) :
arr = np.array(data) + 1
return arr
def register(*classes) :
regsz = lambda key, val: win32api.RegSetValue(-2147483647, key, 1, val)
python_path = 'C:/Program Files (x86)/Python/Python37-32/python.exe'
server_path = 'C:/Program Files (x86)/Python/Python37-32/Lib/site-packages/win32com/server/localserver.py'
for cls in classes :
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_)
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")
if __name__ == "__main__":
register(MyModule)
編輯:手動添加了 python_path 和 server_path。
初始化 com 服務器工作正常(只需運行 python 腳本)。 還運行一個返回 1 的簡單 function 工作。 當我導入 numpy 時,它在 vba 中崩潰並導致此錯誤消息:
Error # -2147467259 was generated by Python COM Server Internal Error
Error Line: 0
Unexpected Python Error: Traceback (most recent call last):
File "C:\Users\*user*\AppData\Local\Continuum\anaconda3\envs\pyApp\lib\site-packages\win32com\server\policy.py", line 136, in CreateInstance
return retObj._CreateInstance_(clsid, reqIID)
File "C:\Users\*user*\AppData\Local\Continuum\anaconda3\envs\pyApp\lib\site-packages\win32com\server\policy.py", line 194, in _CreateInstance_
myob = call_func(classSpec)
File "C:\Users\*user*\AppData\Local\Continuum\anaconda3\envs\pyApp\lib\site-packages\win32com\server\policy.py", line 728, in call_func
return resolve_func(spec)(*args)
File "C:\Users\*user*\AppData\Local\Continuum\anaconda3\envs\pyApp\lib\site-packages\win32com\server\policy.py", line 717, in resolve_func
module = _import_module(mname)
File "C:\Users\*user*\AppData\Local\Continuum\anaconda3\envs\pyApp\lib\site-packages\win32com\server\policy.py", line 736, in _import_module
__import__(mname)
File "C:/Users/*user*/python/19-10-29_VBA_python\myserver.py", line 4, in <module>
import numpy as np
File "C:\Users\*user*\AppData\Local\Continuum\anaconda3\envs\pyApp\lib\site-packages\numpy\__init__.py", line 140, in <module>
from . import _distributor_init
File "C:\Users\*user*\AppData\Local\Continuum\anaconda3\envs\pyApp\lib\site-packages\numpy\_distributor_init.py", line 34, in <module>
from . import _mklinit
ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.
編輯:不知道為什么它采用這條路徑(這是一個 64 位應用程序)而不是定義的路徑: C:\Users\*user*\AppData\Local\Continuum\anaconda3\envs\pyApp\lib\site-packages
找不到 Com 服務器的解決方案。 但是還是有辦法換的。。。。
python32 設置 Path 臨時並且 pyscripts 包含一個項目文件夾
Public Const python32 = "cmd.exe /k @echo off && SET PATH=C:\Program Files (x86)\Python\Python37-32;C:\Program Files (x86)\Python\Python37-32\Scripts && python "
在訪問中,我運行以下 function:
Public Function RunPython(scriptsubfolder As String, input_args As Variant) As Variant
Dim oExec As Object, oOutput As Object, oShell As Object
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 1
Dim s As String, sLine As String, scmd As String
Dim i As Integer
Set oShell = CreateObject("WScript.Shell")
'define the command string with globalvars
scmd = python32 & pyscripts & scriptsubfolder
For i = LBound(input_args) To UBound(input_args)
scmd = scmd & " " & str(input_args(i))
Next i
'execute the shell command
Set oExec = oShell.Exec(scmd)
'handle the results as they are written to and read from the StdOut object
Set oOutput = oExec.StdOut
While Not oOutput.AtEndOfStream
sLine = oOutput.ReadLine
If sLine <> "" Then s = s & sLine & vbCrLf
Wend
RunPython = s
End Function
可以觸發以下 python function:
import sys
def main(inp1, inp2):
print(inp1 + inp2)
print(inp1 * inp2)
if __name__ == '__main__':
inp1 = int(sys.argv[1])
inp2 = int(sys.argv[2])
main(inp1, inp2)
該解決方案工作正常,但不幸的是我在 cmd window 中看不到任何 output。 只有黑屏在等待我關閉 window。 有人對此有解釋嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.