VBA调用Python脚本时os.getcwd()返回路径与实际不符如何解决?
问题原因
os.getcwd() 获取的是当前进程的运行工作目录,而非Python脚本本身的存放目录。直接运行py文件时,启动进程的工作目录和脚本目录一致,结果符合预期;通过VBA/批处理调用时,进程默认工作目录是调用方(Excel)的默认工作目录,所以路径出现偏差。你用ChDir不生效是因为VBA的ChDir只能修改同盘符下的工作路径,跨盘符切换需要先指定盘符。
方案1:修改Python代码(更稳妥,不受调用方影响)
把获取路径的逻辑改成获取Python脚本本身的存放目录,不管从哪调用都能拿到正确的D:\Cockpit路径,修改后的代码如下:
import os # 替换原来的os.getcwd(),获取当前py文件所在的目录 mainpath = os.path.dirname(os.path.abspath(__file__)) errors = [] errors.append(mainpath) fpath = os.path.join(mainpath, "Path.txt") # 不用硬写盘符路径,兼容性更好 with open(fpath, "w+", encoding="utf-8") as f: for i in errors: f.write(f"{i}\r\n")
说明:__file__是Python内置变量,存储当前脚本的完整路径,os.path.abspath转成绝对路径后再取上级目录就是脚本所在文件夹,完全不依赖进程工作目录,怎么调用都不会错。
方案2:修改VBA代码(调整调用时的工作目录)
如果不想改Python代码,就在VBA调用批处理前,直接修改WScript.Shell的CurrentDirectory属性即可,无需处理跨盘符切换的问题:
Sub RunAggregation() Dim oShell As Object, oCmd As String, cwd As String Dim oExec As Object, oOutput As Object Set oShell = CreateObject("WScript.Shell") ' 新增下面这行,直接指定Shell对象的工作目录为D:\Cockpit oShell.CurrentDirectory = "D:\Cockpit" cwd = Application.ActiveWorkbook.Path oCmd = cwd & "\batch1.bat" MsgBox (oCmd) Set oExec = oShell.Exec(oCmd) Set oOutput = oExec.StdOut Set oOutput = Nothing: Set oExec = Nothing Set oShell = Nothing End Sub
内容的提问来源于stack exchange,提问作者Vishwesh Patil
相关产品推荐
相关产品推荐

