我正在尝试运行一个 VBA 模块,该模块使用 shell 脚本来运行 ipython 笔记本(使用 runipy),然后再继续执行其他操作,但我的 ipython 笔记本脚本需要输入,这些输入是使用环境变量设置的。
这是我迄今为止拥有的 VBA:
rundate = Range("b1").Value
shellScript = "runipy C:\argstest.ipynb"
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 1
Set wshSystemEnv = wsh.Environment("SYSTEM")
wshSystemEnv("CURRWK") = rundate
如果我然后运行:
MsgBox (wshSystemEnv("CURRWK"))
结果正确:
2015-04-17
但是,如果我继续并执行我的 shell 脚本,它无法识别此变量
Set WshShellExec = wsh.exec(shellScript)
Range("a1").Value = WshShellExec.StdErr.ReadAll
告诉我,当 python 运行时,它会出现一个关键错误:
KeyError: 'CURRWK'
如果我删除 VBA 并直接从命令行运行它,我会这样做:
set CURRWK=2015-04-17
runipy C:\Python27\Programs\ipython\ACT\argstest.ipynb
如何获取在 VBA 中创建的 shell 来创建新的环境变量,以便 python 脚本在执行时可以看到它?
谢谢!
最佳答案
您是否尝试过Process
而不是SYSTEM
?您的 VBA 可能无权修改系统级变量。 (“但它可以在设置后读回它,”你说。确实如此,但你的脚本可能启用了注册表虚拟化。)进程最接近地模拟命令行 SET
语句,因为更改仅对于当前进程和子进程并且不会被持久化。
关于python - VBA shell脚本在执行前设置环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29832234/