烦人的问题 - WindowsApps 加载 Python 安装而不是用户安装 Python - 在公司 PC 上无法更改环境变量 - VBA

Annoying issue - WindowsApps loads Python install instead of user's installed Python - on corporate PCs cannot change environment variables - VBA

我有一个非常烦人的问题,这是公司政策的结果 - 即用户无法编辑他们的路径。现在我想通了 VBA 来改变 USER 路径,但只有一个问题 - 所有安装都有,在 SYSTEM 环境变量中:%USERPROFILE%\AppData\Local\Microsoft\WindowsApps

所以发生的是脚本会话的 PATH 将采用 SYSTEM 路径并将 USER 路径附加到它。非常正常的 Windows 行为。我 运行 在设置路径后遇到的问题是 ORDER 导致的问题。 WindowsApps 将 Python 作为安装包,因此如果它在 PATH 语句中排在第一位,在某些 PC 上它会尝试加载 Python 安装,而不是用户安装的 Python (!) 烦人,对吧?是的,我是从它的安装目录调用 Python,所以我不确定到底是什么问题。

现在我拥有开发者权限,所以我基本上可以 100% 控制我的笔记本电脑。但我的最终用户不会。如果没有公司封锁,我只会让用户从他们的系统路径中删除 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!那么为什么有些 PC 仍然从 Windows 应用程序打开 Python???我单步执行 VBA 代码并验证传递给 shell 的命令行是否正确。我在设置路径后打开了CMD提示符,并且都正确修改了。我只是对为什么这不适用于所有人感到困惑。如果有人知道可能是什么问题,请告诉我。

请尝试下一个函数来获取打开特定扩展程序的任何(已安装)应用程序的安装路径(默认):

Private Function GetExePath(ext As String) As String
    Dim strAppl As String, strPathExe As String, strExeFile As String
    Dim WSHShell As Object

    Set WSHShell = CreateObject("WScript.Shell")
    On Error Resume Next
    strAppl = WSHShell.RegRead("HKEY_CLASSES_ROOT\" & WSHShell.RegRead("HKEY_CLASSES_ROOT\" & ext & "\") & _
                                                                                  "\shell\open\command\")
    If err.Number <> 0 Then
        err.Clear: On Error GoTo 0
        GetExePath = ""
        MsgBox "No program installed for extension """ & ext & """"
        Exit Function
    End If
    On Error GoTo 0
    strExeFile = Split(strAppl, """ """)(0)
    strExeFile = Right(strExeFile, Len(strExeFile) - 1)
    GetExePath = strExeFile
End Function

您可以通过以下方式进行测试:

Private Sub testGetExeP()
   Debug.Print GetExePath(".xls")
   Debug.Print GetExePath(".pdf")
   Debug.Print GetExePath(".py")
End Sub

请尝试将使用的工作簿中的路径与返回的 exe 路径进行比较。首先,检查我的假设(来自上述评论)是否得到证实,其次使用函数而不是从任何工作簿中提取的路径。