Python - 使用 vbscript 获取变量

Python - Acquiring variables with vbscript

我正在开发一个 python 代码,它调用一个 VB 脚本来执行一些计算。这些计算必须在 VB 脚本中执行,并且无法将它们迁移到 Python 脚本。

我在 VB 脚本中像这样发送变量:

WScript.Echo("TEST")

并尝试在 Python 代码中获取它们:

p = subprocess.Popen(['cscript.exe', VB_path, nLM, nSD, nSO, nTWS, nROH, 
                      nMOH1, nMOH2, nRad1, nRad3, nLstk, nT_Shaft_EN, S_path, 
                      S_file, S_version, nkE_ref, nTC_ref, nNImax, nCost_PM, 
                      nCost_Steel, nCost_Wire, '//nologo'], stdout=subprocess.PIPE, shell=True)
out, err = p.communicate()
out

我得到的“out”结果如下:

b'Test\r\n'

我的问题是:如何使用普通变量发送多个输出?另外,作为奖励问题,是否有任何明显的方法可以以这种方式将数组从 vb 发送到 python 脚本?

由于文本(通过 stdout 流)是您的通信方式,发送多个值(数据结构)的明显方法是将其序列化为通信双方都同意的众所周知的格式。

一种常见的方法是 JSON,但是 JSON 相对难以用普通 VBScript 生成。其他明显的候选者是 CSV,或 XML,或 INI,但最终:您可以想到的任何格式。

选择众所周知的格式的好处是其他人已经为它们编写了解析器。您提出的格式要求您自己编写解析器。

让我们假设 INI 格式能够表示您的数据:

[section]
key_a = value_a
key_b = value_b

这种输出很容易在 VBScript 中生成,Python 有 configparser 可以读取它。

所以我们可以用 VBScript 编写几个助手:

Sub OutputSection(name)
    WScript.StdOut.WriteLine(vbNewLine & "[" & name & "]")
End Sub

Sub OutputVariable(name, value)
    Dim i
    If IsArray(value) Then
        If UBound(value) = -1 Then
            WScript.StdOut.WriteLine(name & ". = ")    ' to signify empty array
        Else
            For i = 0 To UBound(value) - 1
                OutputVariable(name & "." & i, value(i))
            Next
        End If
    Else
        WScript.StdOut.WriteLine(name & " = " & value)
    End IF
End Sub

在您的脚本中调用这些将生成整齐有序的输出

[main]
key = value

[some_array]
array.0 = value0
array.1 = value1
array.2 = value2

在 Python 中,您可以添加一个 post 处理步骤,将单个数组项转换为列表。

或者,您在 VBScript 中将 Join() 用于数组,这将使 Sub OutputVariable() 和 Python 端的解析更简单,但您 运行如果列表定界符可以出现在数组值中,则存在破坏数据的风险。这是一个权衡。