You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:09:02