安装程序:将python作为第三方软件安装后,无法直接在path环境变量中找到它

2024-06-02 11:21:54 发布

您现在位置:Python中文网/ 问答频道 /正文

对于我的软件(仅适用于Windows),我使用NSIS创建了一个安装程序。为了让软件正常工作,我将python(3.6.5版)作为第三方软件(.exe文件)提供。此外,我需要进行pip升级并安装一些模块(例如NumPy)

我对NSIS安装程序的方法如下:

  1. 运行可执行python安装程序:在我的安装程序中,提醒用户将python添加到环境%path%变量中。提取所有文件后,将执行python第三方安装程序。Python已安装并添加到%path%

  2. <强> >运行小C++脚本(^ {< CD1>})>(除其他事项外),脚本使用P{T2}{} CD2>}从Python目录匹配路径变量。如果python在path中,那么它会执行一些命令,如

python -m pip install --upgrade pip
python -m pip install numpy

否则它只打印“python not found”和整个path环境变量

在NSIS中,其实现方式如下(简化):

SetOutPath "$INSTDIR\python"
File "D:\python\python-3.6.5.exe"
ExecWait '"$INSTDIR\python\python-3.6.5.exe" InstallAllUsers=1 PrependPath=1'
Sleep 500
File "D:\python\PythonSetup.exe"
ExecWait '"$INSTDIR\python\PythonSetup.exe" $INSTDIR'
Sleep 500
SetOutPath "$INSTDIR"
Delete "$INSTDIR\python\python-3.6.5.exe"
Delete "$INSTDIR\python\PythonSetup.exe"
RmDir "$INSTDIR\python"

我的问题是

  • PythonSetup.exe在%path%变量中找不到python目录。打印我从Windows.h使用GetEnvironmentVariable得到的路径,我可以看到它得到的路径实际上不包含python目录
  • 强制执行上面提到的命令,我会得到错误:'python.exe' is not recognized as an internal or external command, operable program or batch file.
  • 但是,在Windows System Properties > Advanced > Environment Variables中检查%path%变量表明python目录确实已添加到path变量中。我在PyhtonSetup.exe的运行时检查了这一点,即在NSIS行ExecWait '"$INSTDIR\python\PythonSetup.exe" $INSTDIR'期间
  • NSIS安装程序完成后立即执行PythonSetup.exe工作正常

我试过了

  • 更长的Sleep
  • 其他python体系结构(32位与64位)
  • 手动查找python目录并以这种方式调用python.exe,例如
C:\Program Files\python36-32\python.exe -m pip install numpy

是否有人知道在PythonSetup.exeGetEnvironmentVariable返回的路径中找不到python目录的原因,同时可以在系统属性中看到它? 我觉得我可能错过了一些明显的东西


Tags: installpip文件path路径目录脚本软件
1条回答
网友
1楼 · 发布于 2024-06-02 11:21:54

当用户登录Windows时,从注册表的用户和计算机部分读取环境变量,并使用这些合并的变量启动初始进程。创建新进程时,它将继承其父进程的环境(除非在启动进程时指定新的自定义环境)

应用程序应该在更改环境时广播WM_SETTINGCHANGE消息,但实际上Explorer是唯一侦听此消息并动态更新其环境的应用程序。这样做的一个主要原因是,Explorer使用一个未记录的函数来执行此更新,而其他应用程序实现相同的功能是一个很大的难题

对于使用自定义变量的应用程序,很容易在安装程序中设置此值,以便由启动的子进程继承:

System::Call 'KERNEL32::SetEnvironmentVariable(t "MYAPP_DIR", t "$InstDir")'

由于各种原因,以同样的方式更新%PATH%很棘手:

  • NSIS有字符串长度限制,可能不适合长的%PATH%
  • %路径%是来自HKCU和HKLM的值的组合,需要进行一些字符串操作才能正确连接它们

我在安装程序中更新%PATH%的唯一建议是使用EnVar plug-in

EnVar::Update "" "PATH"
Pop $0 ; "0" on success

相关问题 更多 >