话说,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脚本的输出,你可以通过 StdOut
和 StdErr
属性来读取。是不是有点像在命令行里执行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,方法有很多种,最简单的就是用 Exec
或 Run
方法直接执行Python脚本,高级一点的可以用COM组件。具体用哪种方法,取决于你的实际需求。如果只是简单地执行一下Python脚本,拿到结果,用 Exec
或 Run
就够了。如果需要更灵活地调用Python脚本里的函数,传递参数,用COM组件会更好。 别怕麻烦,多尝试几次,总能找到最适合你的方法。毕竟,编程嘛,就是要不断折腾,才能有所进步。加油!
评论(0)