以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://222.73.7.161/bbs/index.asp)
--  高级功能研发区  (http://222.73.7.161/bbs/list.asp?boardid=5)
----  请问vba调用python的模块如何返回两个列表?  (http://222.73.7.161/bbs/dispbbs.asp?boardid=5&id=185026)

--  作者:netwalker
--  发布时间:2021/4/4 23:02:55
--  请问vba调用python的模块如何返回两个列表?
vbs代码:

Sub pyArrays()
      Dim inArray \'创建一个变量
      \'创建Array外部对象,将对象实例置变量d1中
      Set inArray = CreateObject("Stock.Array")
      inArray.AddBack(1)
      inArray.AddBack(2)
      \'创建外部对象,启用Python引擎 
      Set py = CreateObject("Stock.Python")
      \'载入Python模块,模块名为MyPython
      pymod = py.ImportModule("jzt_MyPython")
      If pymod <> 1 Then
              \'载入失败,打印错误原因
              Msg = py.GetErrorInfo()
              Application.MsgOut Msg
              Set Msg = Nothing  \'使用完毕需要 Set Nothing销毁以免出现内存泄漏
              Exit Sub
      End If
      \'调用Python模块函数,函数名pytestmodule,参数为Array外部对象d1
      set outArray = py.CallObject("return_arrays",inArray,inArray) 
       If IsEmpty(outArray) Then
              Msg = py.GetErrorInfo()
              Application.MsgOut Msg
              Set Msg = Nothing   \'使用完毕需要 Set Nothing销毁以免出现内存泄漏
              Exit Sub
       End If
       \'打印返回值 
       \'application.MsgOut Vartype(outArray)
       item= outArray.GetAt(0)
       application.MsgOut  Vartype(item)
       Set py = nothing  \'使用完毕需要 Set Nothing销毁以免出现内存泄漏
       set inArray = nothing  \'使用完毕需要 Set Nothing销毁以免出现内存泄漏
end Sub

python模块代码

def return_arrays(x1,x2):
    print(x1)
    print(type(x1))
    a = [1,2,3]
    b = [4,5,6,7]
    return [a,b]

返回的是一个object,如何把python里面的a,b取出来?
谢谢!
[此贴子已经被作者于2021/4/4 23:03:24编辑过]

--  作者:yukizzc
--  发布时间:2021/4/5 12:16:52
--  

Sub Test()
      Dim d1 \'创建一个变量
      \'创建Array外部对象,将对象实例置变量d1中
      Set d1 = CreateObject("Stock.Array")
      d1.AddBack(1)
      d1.AddBack(2)
      \'创建外部对象,启用Python引擎
      Set d = CreateObject("Stock.Python")
      \'载入Python模块,模块名为MyPython
      ret = d.ImportModule("jzt_ta")
      If ret <> 1 Then
              \'载入失败,打印错误原因
              Msg = d.GetErrorInfo()
              Application.MsgOut Msg
              Set Msg = Nothing  \'使用完毕需要 Set Nothing销毁以免出现内存泄漏
              Exit Sub
      End If
      \'调用Python模块函数,函数名pytestmodule,参数为Array外部对象d1
      set Data = d.CallObject("zhibiao_vba",d1,d1)
       If IsEmpty(Data) Then
              Msg = d.GetErrorInfo()
              Application.MsgOut Msg
              Set Msg = Nothing   \'使用完毕需要 Set Nothing销毁以免出现内存泄漏
              Exit Sub
       End If
       \'打印返回值
       application.MsgOut Data.GetAt(1)
       Set d = nothing  \'使用完毕需要 Set Nothing销毁以免出现内存泄漏
       set d1 = nothing  \'使用完毕需要 Set Nothing销毁以免出现内存泄漏
end Sub
call Test

 

 

 

 

python模块中代码

 

from PythonApi import *
import numpy as np
def zhibiao_vba(x1,x2):
    print(x1)
    a = [1,2,3]
    return a


--  作者:netwalker
--  发布时间:2021/4/6 9:57:07
--  
谢谢,这段代码是返回一个列表的情况,我的问题是python模块怎样返回两个列表?


--  作者:netwalker
--  发布时间:2021/4/6 10:00:07
--  
谢谢,这段代码是返回一个列表的情况,我的问题是python模块怎样返回两个列表?
比如:
    a = [1,2,3]
    b = [4,5,6,7]

我试了 return a,b ,结果报错。用    return [a,b],返回的是一个object,但a和b的内容取不出来,望指教!

--  作者:yukizzc
--  发布时间:2021/4/6 10:00:43
--  

这种不行的,vba和python不一样,有些格式没有办法的