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 端的解析更简单,但您 运行如果列表定界符可以出现在数组值中,则存在破坏数据的风险。这是一个权衡。
我正在开发一个 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 端的解析更简单,但您 运行如果列表定界符可以出现在数组值中,则存在破坏数据的风险。这是一个权衡。