【问题标题】:WindowsApps loads Python install instead of user's installed PythonWindowsApps 加载 Python 安装而不是用户安装的 Python
【发布时间】: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 PythonEXEImmediate Window 中返回的内容,就在objShell.Run PythonEXE & " " & PythonScript, WindowStyle, WaitOnReturn 行之前。如果您使用相同的工作簿,则返回的路径可能不是正确的。您还可以使用Debug.print Dir(PythonScript) 检查相应的路径是否存在。它是否返回必要的路径?
  • 嗯,我在单步执行代码时打开了一个 CMD 提示符,并看到 VBA 代码正确附加了路径。完成后,我打开另一个 CMD 提示符,路径恢复正常。所以它正在被修改。让我试试你发布的那些命令,看看会发生什么 - 我试图找出一个调试所有东西的好方法,非常感谢你!
  • 我想强调的不是colUserEnvVars.Item("PATH") 没有正确填充。我只是建议这个操作没用,因为你提供了真正的必要路径。我认为问题仍然存在于从工作簿收集的路径中。请尝试我上面的建议,看看你能找到什么。当然,这只是一个假设……
  • 是的,我认为我必须使用其他人的计算机,因为目录在即时窗口中按预期出现,并且代码在我的笔记本电脑上运行良好。所以我需要找到其中一台有问题的电脑并在那里进行故障排除......
  • 当然!我的猜想正是这种可能性...... exe应用程序可以安装在不同的路径上。如有必要,我可以发布一个函数,该函数能够返回默认打开特定扩展的任何应用程序的路径。从注册表中提取。这样,你的代码就可以使用了,从运行代码的电脑中提取出来……

标签: python vba path


【解决方案1】:

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

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 路径进行比较。首先,检查我的假设(来自上述评论)是否得到证实,其次使用该函数而不是从任何工作簿中提取的路径。

【讨论】:

  • 我会试一试 - 无论如何找到安装在系统上使用的注册 Python 更有意义(我不确定其他人(非开发人员)是否可以读取注册表,但它是值得一试)。我仍然必须添加路径,否则 NumPy 会出错,但从注册表中获取它们会使用户更容易。非常感谢!
猜你喜欢
  • 2015-02-22
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多