将 return 值从 Python 脚本传递到 VB 脚本

Passing return value from Python script to VB script

我有一个 VB 脚本 (UFT) 代码触发 Python 脚本来检查图像是否符合要求的颜色并且 python 脚本是 return使用颜色值将字符串返回到 VB 脚本。 我能够从 VB 脚本调用 python 脚本,并且 python 脚本也被执行并 returned 值。我的问题是无法在任何变量中保存 return 值,它只是空白

下面是我的 VB 调用 python 脚本的脚本代码

Function Verifycolor(icolor,ipath,rValue)

Dim pyr
Set pyShell = CreateObject("Wscript.Shell")
color = icolor
Imagepath = ipath
pyColorVerify = "python ""C:\Users\a272099\Desktop\Python\codes\Verifycolor.py""" & " " & color & " " & ImagePath
Set pyOperation = pyShell.Exec(pyColorVerify)
Set pyResult = pyOperation.StdOut
wait(1)
msgbox pyResult.ReadAll


pyr = pyResult.ReadAll

msgbox pyr

'Do 
'pyRet = pyResult.ReadAll
''msgbox pyReturn
'wait(1)
'Loop Until pyReturn <> empty

If pyr = rValue  Then
        Reporter.ReportEvent micPass,"Preconditions are not set to" &color& "color","preconditions are set"
    Else
        Reporter.ReportEvent micFail,"Preconditions are set  to" &color& "color","preconditions are set"
End If

msgbox pyResult.ReadAll

End Function

下面是 python 脚本 return 对 VB 脚本的值(验证颜色)

import sys
import numpy as np
import pytesseract
from PIL import Image
from pytesseract import image_to_string
import cv2
color = sys.argv[1]
src_path = sys.argv[2]
#src_path = "C:\Users\a291068\Desktop\Python\PreconditionsImage.png"
img=cv2.imread(src_path)
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
if color == "RED":
    mask_red = cv2.inRange(img_hsv, (0,50,20), (5,255,255))
    if cv2.countNonZero(mask_red) > 0:
        Return = "Red is present!"
    else:
        Return = "Red is not present!"
else:
    if color == "GREEN":
        mask_green = cv2.inRange(img_hsv, (36,25,25), (70,255,255))
        if cv2.countNonZero(mask_green) > 0:
            Return= "Green is present!"
        else:
            Return = "Green is not present!"
print(Return) 

当 python 是 returning 值时,问题出在我的 VB 脚本中 当我执行 Msgbox PyResult.Readall 时,我收到的正确消息是 return 从 Python 编辑的,绿色存在或绿色不存在。

如果我将该值分配给任何变量,如 pyr。 pyr 总是空的,没有任何东西被存储。

请帮助我解决将 pyResult.ReadAll 存储到变量的问题,以便我可以在其他条件下使用它。

如果需要更多信息,请告诉我。

看来ReadAll方法也清除了StdOut中的内容,所以只能用一次

在您的示例中,它适用于行

msgbox pyResult.ReadAll

但是在这个调用之后你的 pyResult 是空的。 再次尝试使用此方法不再有效,因此在这一行中

pyr = pyResult.ReadAll

它returns一个空字符串。

只需删除第一个调用

msgbox pyResult.ReadAll

并且只调用 ReadAll 一次将返回值存储到这样的变量中

pyr = pyResult.ReadAll

从那时起,如果您需要该值,请仅使用 pyr,并且不再调用 ReadAll