[英]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,但使用普通 VBScript 生成 JSON 相對困難。 其他明顯的候選者可能是 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 中,您可以添加一個后處理步驟,將單個數組項轉換為列表。
或者,您在 VBScript 中將Join()
用於數組,這將使Sub OutputVariable()
和 Python 端的解析更簡單,但如果列表分隔符可能出現在數組值中,您將面臨損壞數據的風險。 這是一種權衡。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.