烦人的问题 - 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 路径进行比较。首先,检查我的假设(来自上述评论)是否得到证实,其次使用函数而不是从任何工作簿中提取的路径。
我有一个非常烦人的问题,这是公司政策的结果 - 即用户无法编辑他们的路径。现在我想通了 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 路径进行比较。首先,检查我的假设(来自上述评论)是否得到证实,其次使用函数而不是从任何工作簿中提取的路径。