【发布时间】:2022-07-21 20:45:08
【问题描述】:
由于公司政策,用户不能编辑他们的路径,不能改变环境变量。
我想通过 VBA 来改变 USER 路径。
有一个问题。所有安装都有,在 SYSTEM 环境变量中:
%USERPROFILE%\AppData\Local\Microsoft\WindowsApps
脚本会话的 PATH 将采用 SYSTEM 路径并将 USER 路径附加到它。非常正常的 Windows 行为。
我在设置路径后遇到的问题是 ORDER 导致问题。 WindowsApps 将 Python 作为安装包,因此如果它在 PATH 语句中首先出现,则在某些 PC 上它会尝试加载 Python 安装,而不是用户安装的 Python。
我拥有开发人员权限,因此我可以控制我的笔记本电脑,但我的最终用户没有。如果没有公司锁定,我会让用户从他们的 SYSTEM PATH 中删除 WindowsApps。
正常的完整目录路径:
%USERPROFILE%\Anaconda3\;
%USERPROFILE%\Anaconda3\Library;
%USERPROFILE%\Anaconda3\Library\bin;
%USERPROFILE%\Anaconda3\Scripts\;
代码:
Sub RunPythonScript()
Dim objShell As Object
Dim PythonExePath, PythonScript As String
Set objShell = VBA.CreateObject("Wscript.Shell")
Dim WaitOnReturn As Boolean
Dim WindowStyle As Integer
WindowStyle = 1
WaitOnReturn = True
' find the Python Path in the workbook
PythonPath_Row = ThisWorkbook.Sheets(ActiveSheet.Name).Columns(1).Find(What:="Python Path", LookIn:=xlValues).Row + 1
PythonPath = ThisWorkbook.Sheets(ActiveSheet.Name).Cells(PythonPath_Row, 1)
' set only the User environment settings since no admin permission required
Set colUserEnvVars = objShell.Environment("User")
' save the original PATH
originalPATH = colUserEnvVars.Item("Path")
' add the needed Python directories to the PATH
colUserEnvVars.Item("PATH") = PythonPath & ";" & PythonPath & "Library" & ";" & PythonPath & "Library\bin" & ";" & PythonPath & "Scripts" & ";" & colUserEnvVars.Item("Path")
PythonScript = """" & ThisWorkbook.Path & "\MyScript.py" & """"
PythonEXE = PythonPath & "python.exe"
' run Python script
objShell.Run PythonEXE & " " & PythonScript, WindowStyle, WaitOnReturn
' put path back to normal
colUserEnvVars.Item("PATH") = originalPATH
End Sub
我明确地从它的安装目录调用 Python。
我单步执行 VBA 代码并验证传递给 shell 的命令行。
我在设置路径后打开了一个CMD提示,都正确修改了。
为什么有些电脑会从 WindowsApps 中打开 Python?
【问题讨论】:
-
恐怕在
objShell.Environment("User")上所做的一切都是徒劳的。由于您从安装文件夹中提供了 exe 文件的路径,因此您之前尝试的任何内容都不会以任何方式使用。而不是你,我之前会检查Debug.Print PythonEXE在Immediate Window中返回的内容,就在objShell.Run PythonEXE & " " & PythonScript, WindowStyle, WaitOnReturn行之前。如果您使用相同的工作簿,则返回的路径可能不是正确的。您还可以使用Debug.print Dir(PythonScript)检查相应的路径是否存在。它是否返回必要的路径? -
嗯,我在单步执行代码时打开了一个 CMD 提示符,并看到 VBA 代码正确附加了路径。完成后,我打开另一个 CMD 提示符,路径恢复正常。所以它正在被修改。让我试试你发布的那些命令,看看会发生什么 - 我试图找出一个调试所有东西的好方法,非常感谢你!
-
我想强调的不是
colUserEnvVars.Item("PATH")没有正确填充。我只是建议这个操作没用,因为你提供了真正的必要路径。我认为问题仍然存在于从工作簿收集的路径中。请尝试我上面的建议,看看你能找到什么。当然,这只是一个假设…… -
是的,我认为我必须使用其他人的计算机,因为目录在即时窗口中按预期出现,并且代码在我的笔记本电脑上运行良好。所以我需要找到其中一台有问题的电脑并在那里进行故障排除......
-
当然!我的猜想正是这种可能性...... exe应用程序可以安装在不同的路径上。如有必要,我可以发布一个函数,该函数能够返回默认打开特定扩展的任何应用程序的路径。从注册表中提取。这样,你的代码就可以使用了,从运行代码的电脑中提取出来……