【发布时间】:2021-01-14 14:54:31
【问题描述】:
对于我的软件(仅适用于 Windows),我使用 NSIS 创建了一个安装程序。为了使软件正常工作,我将 python(版本 3.6.5)作为第 3 方软件(.exe 文件)提供。此外,我需要进行 pip 升级并安装一些模块(例如 NumPy)。
我对 NSIS 安装程序的方法如下:
-
运行可执行 python 安装程序:在我的安装程序中,提醒用户将 python 添加到环境 %path% 变量中。提取所有文件后,执行 python 的第 3 方安装程序。 Python 已安装并添加到 %path%。
-
运行小型 C++ 脚本 (
PythonSetup.exe):(除其他外)该脚本使用来自Windows.h的GetEnvironmentVariable匹配 python 目录的路径变量。如果 python 在路径中,那么它会执行一些命令,例如
python -m pip install --upgrade pip
python -m pip install numpy
否则它只会打印“python not found”和整个路径环境变量。
在 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 目录确实已添加到路径变量中。我在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.exe中GetEnvironmentVariable返回的路径中为什么找不到python目录的原因,同时可以在系统属性中看到?
我觉得我可能遗漏了一些明显的东西......
【问题讨论】:
-
你说的是 %path% 还是其他环境变量?
-
是的,我说的是 %path%