话说,VBScript,这玩意儿,多少年前的老古董了,但有些时候你还真就离不开它。尤其是在一些老的Windows系统环境下,或者需要直接操作COM组件的时候,VBS还是挺好使的。可问题是,VBS的能耐也就那样,处理复杂逻辑、数据分析什么的,简直抓瞎。这时候,咱就得请出Python大神来救场了!怎么让这俩货配合起来?这就是今天要聊的重点:VBS怎么调用Python

我记得刚开始接触这玩意儿的时候,也是一头雾水。网上搜了一堆教程,要么是语焉不详,要么是直接贴代码,看得我脑仁疼。后来自己摸索了一段时间,才算搞明白,其实也就那么回事。

最简单粗暴的方法,就是用 WScript.Shell 对象的 Exec 方法来执行Python脚本。这玩意儿就像个小型的命令行解释器,你把要执行的命令扔给它,它就吭哧吭哧地去跑。

“`vbs
Set objShell = CreateObject(“WScript.Shell”)
Dim pythonExe, pythonScript, cmd, objExec
pythonExe = “C:\Python39\python.exe” ‘ 你的python.exe的路径,注意替换!
pythonScript = “D:\my_script.py” ‘ 你的python脚本路径,注意替换!

cmd = pythonExe & ” ” & pythonScript

Set objExec = objShell.Exec(cmd)

‘ 可以读取python脚本的输出
Do While objExec.StdOut.AtEndOfStream <> True
WScript.Echo objExec.StdOut.ReadLine()
Loop

‘ 或者读取错误信息
Do While objExec.StdErr.AtEndOfStream <> True
WScript.Echo “Error: ” & objExec.StdErr.ReadLine()
Loop

WScript.Quit
“`

这段代码,简单吧? 就是先创建 WScript.Shell 对象,然后定义Python解释器和脚本的路径,最后用 Exec 方法执行。跑起来之后,Python脚本的输出,你可以通过 StdOutStdErr 属性来读取。是不是有点像在命令行里执行Python脚本的感觉?

不过,这种方法有个缺点,就是VBS会一直等待Python脚本执行完毕才会继续往下走。如果你的Python脚本跑得时间比较长,VBS就得在那儿干等着,体验不太好。

所以,如果你不想让VBS干等,可以用 Run 方法。

“`vbs
Set objShell = CreateObject(“WScript.Shell”)
Dim pythonExe, pythonScript, cmd
pythonExe = “C:\Python39\python.exe” ‘ 你的python.exe的路径,注意替换!
pythonScript = “D:\my_script.py” ‘ 你的python脚本路径,注意替换!

cmd = pythonExe & ” ” & pythonScript

objShell.Run cmd, 0, False ‘ 第二个参数0代表隐藏窗口,第三个参数False代表不等待

WScript.Echo “Python 脚本已经启动,VBS 继续执行。”
“`

注意看,Run 方法的第二个参数是 0,表示隐藏命令行窗口。第三个参数是 False,表示VBS不用等待Python脚本执行完毕,直接往下执行。这样,VBS就可以一边干着自己的事情,一边让Python脚本在后台默默地跑着,效率更高。

但问题又来了,用了 Run 方法,VBS就没法直接读取Python脚本的输出了。那要是我想拿到Python脚本的执行结果怎么办?

别慌,办法总是有的。你可以让Python脚本把结果写到文件里,然后VBS再去读取这个文件。

Python脚本(my_script.py):

“`python
import time

result = “Hello from Python!”
time.sleep(5) # 模拟耗时操作
with open(“result.txt”, “w”) as f:
f.write(result)
“`

VBS脚本:

“`vbs
Set objShell = CreateObject(“WScript.Shell”)
Dim pythonExe, pythonScript, cmd
pythonExe = “C:\Python39\python.exe” ‘ 你的python.exe的路径,注意替换!
pythonScript = “D:\my_script.py” ‘ 你的python脚本路径,注意替换!

cmd = pythonExe & ” ” & pythonScript

objShell.Run cmd, 0, False

WScript.Sleep 1000 ‘ 等待一段时间,确保Python脚本已经写完文件

Set objFSO = CreateObject(“Scripting.FileSystemObject”)
Set objFile = objFSO.OpenTextFile(“result.txt”, 1) ‘ 1 表示读取
result = objFile.ReadAll
objFile.Close

WScript.Echo “Python 脚本返回的结果是:” & result
“`

这样,Python脚本就把结果写到了 result.txt 文件里,VBS再去读取这个文件,拿到结果。 当然,这里加了个 WScript.Sleep,是为了保证Python脚本已经写完文件,VBS再去读取,实际应用中需要根据你的Python脚本执行时间来调整这个等待时间。

还有一种更高级的玩法,就是用COM组件。你可以把Python脚本封装成COM组件,然后在VBS里直接调用COM组件的方法。这种方法的好处是,VBS可以直接调用Python脚本里的函数,而且可以传递参数,使用起来更灵活。但缺点是,配置起来稍微麻烦一点。

要用COM组件,你需要用到 pywin32 这个库。

“`python

my_com_script.py

import win32com.client
from win32com.client import Dispatch

class PythonCOM:
reg_clsid = “{你的GUID}” # 替换成你自己的GUID
reg_progid = “Python.MyCOM”
public_methods = [‘MyFunction’]
readonly_attrs = [‘version’]
version = “1.0”

def MyFunction(self, name):
    return "Hello, " + name + "! From Python COM."

注册COM组件

if name == ‘main‘:
import win32com.server.register
win32com.server.register.UseCommandLine(PythonCOM)

“`

然后,用以下命令注册COM组件:

bash
python my_com_script.py --register

VBS脚本:

vbs
Set obj = CreateObject("Python.MyCOM")
result = obj.MyFunction("World")
WScript.Echo result ' 输出 "Hello, World! From Python COM."

这个例子,Python脚本定义了一个 MyFunction 函数,VBS直接调用这个函数,并传递了参数 “World”。

总结一下,VBS怎么调用Python,方法有很多种,最简单的就是用 ExecRun 方法直接执行Python脚本,高级一点的可以用COM组件。具体用哪种方法,取决于你的实际需求。如果只是简单地执行一下Python脚本,拿到结果,用 ExecRun 就够了。如果需要更灵活地调用Python脚本里的函数,传递参数,用COM组件会更好。 别怕麻烦,多尝试几次,总能找到最适合你的方法。毕竟,编程嘛,就是要不断折腾,才能有所进步。加油!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。