#设计
最近因为需要用Python写个小程序给同事用,但是用pyinstaller打包好后在同事的Win7系统上运行出错,提示如下错误:
缺少DLL一般都是因为没有运行库,我百度查了下资料,有些帖子说是因为没安装运行库,我试着重新安装了所有运行库以及那片帖子提到的库,但是好像并没有什么效果。
后来 https://cloud.tencent.com/developer/article/1848431 这篇帖子中说到是因为3.8.6以后的Python版本不在支持Win7了,所以需要将Python降级到3.8.6重新打包就能解决这个问题。
直接安装肯定会出问题,因为我的电脑中已经安装了 3.11.0
,因为以前了解过nodejs有多版本的环境管理工具,就试着搜索了一下,python也有一款叫 pyenv-win
的win平台版本管理工具。
pyenv可以通过安装包、pip、powershell等多种方式安装。
其中以powershell的方式最为简单,直接运行下面这个命令即可。
Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"
如果出错了可能是因为你没有设置远程脚本运行权限,执行下面这个代码后再执行上面的安装命令即可。
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine
参考:https://github.com/pyenv-win/pyenv-win/blob/master/docs/installation.md#installation
pyenv安装后可以通过下面这些命令进行控制,如: pyenv local 3.10.5
、 pyenv install 3.8.6
等等。
commands List all available pyenv commands
local (设置当前目录的python版本,没设置默认使用全局的)
global (设置全局python版本)Set or show the global Python version
shell Set or show the shell-specific Python version
install (安装python版本)
uninstall Uninstall 1 or more versions of Python
update Update the cached version DB
rehash Rehash pyenv shims (run this after switching Python versions)
vname Show the current Python version
version Show the current Python version and its origin
version-name Show the current Python version
versions List all Python versions available to pyenv
exec Runs an executable by first preparing PATH so that the selected Python
which Display the full path to an executable
whence List all Python versions that contain the given executable
不过我在安装好pyenv后发现在使用pyenv install安装python版本时提示下面这个错误,我找遍了全网都没有相关的资料,最后还是自己改了它的安装脚本才得以解决。
error extracting the web portion from the installer.
couldn't install 3.8.6
pyenv是使用一个vbs脚本安装python的(C:\Users\me.pyenv\pyenv-win\libexec\pyenv-install.vbs),我看了下脚本的执行流程,如下:
我检查了pyenv的安装目录,发现install_cache目录下是有文件的,但是version目录下没有文件,程序执行到第三部就出错了,我后来也通过在脚本里添加输出信息测试了出来。
经过我的测试,程序执行到 If deepExtract Then
便终止了
If Not objfs.FolderExists(cachePath) Then
deepExtract = objws.Run(""""& params(IP_InstallFile) &""" /quiet /layout """& cachePath &"""", 0, True)
If deepExtract Then
WScript.Echo "在这里出错了。"
WScript.Echo ":: [Error] :: error extracting the web portion from the installer."
Exit Function
End If
结合上下文代码,似乎 deepExtract = objws.Run(""""& params(IP_InstallFile) &""" /quiet /layout """& cachePath &"""", 0, True)
在这一段执行结果没有返回预期值,所以提前进入了错误的判断中,并提前调用了 Exit Function
退出了函数。
所以我尝试注释 Exit Function
,并重新执行安装。
Good,这次成功运行。
加入评论