虚拟环境迁移问题排查
背景
某项目开发过程中python虚拟环境通过anaconda conda创建,然后将该虚拟环境直接复制到开发环境中,将整个项目打包成exe之后,出现了一个奇怪的问题:在win8,win10,win11上均没有问题,但在win7上运行过程中出现了缺包的问题。
- 【WinError127】找不到指定的程序:pywin32_system32和numpy\.libs.
- 电脑版本:win7 专业版 Service Pack 1
问题排查
问题复现
我们在相同的电脑版本上,尝试进行该问题的复现。
- 首先通过虚拟环境打开对应的python.exe。然后重新导入缺少的包:
import numpy as np
发现并为报错。
- 针对当前项目,原来python服务是通过js命令自动调用,我们产生尝试手动启动python服务,发现其也可以正常启动。所以可以说明打包的虚拟环境没有问题。
pywin32_system32
根据网上的经验,需要将虚拟环境下pywin32_system32下
包下的动态链接库复制到对应C:Windows\System32
.
(继续尝试...)
追加环境变量
将虚拟环境中的python.exe的安装路径添加到环境变量中.
(然并卵,继续复现...)。
win7 上安装python
版本问题
如指定PEP 11,Python 版本仅支持 Windows 平台,而 Microsoft 认为该平台处于扩展支持之下。这意味着 Python 3.11 支持 Windows 8.1 和更新版本。如果您需要 Windows 7 支持,请安装 Python 3.8。
当前版本(python3.8.5 )支持
在win7 sp1上安装Python3.8
网上资源
stackoverflow:Installing Python 3.8 on windows 7 32bit with SP1
![(C:/Users/B_Hanan/AppData/Roaming/Typora/typora-user-images/image-20221111091552434.png)
验证过程
查看当前电脑的补丁库,发现补丁KB2533623已经存在,所以我们先手动卸载,重新打开python.exe发现,可以复现缺包的问题。然后我们重新安装该补丁,缺包问题解决。
在此基础上,我们回退我们之前的操作:移除追加的环境变量、移除动态链接库,发现一切仍然正常可以使用。
所以在当前问题中影响python虚拟环境缺包的真正问题应该是win7系统缺少"KB2533623"导致.
资源链接:Here
离线包安装
背景
将python库及其依赖包下载下来,然后离线安装。
下载离线包的方式:
需求:安装pymoo库
step1:创建与现场python版本相同的虚拟环境;
step2:创建requirement.txt :里面写pymoo(即我们需要离线下载的库,如果版本未知,可以不写);
step3:使用下述命令进行下载:
pip download -d dir -r requirement.txt
# dir是所有依赖包存放的位置;
step4:然后将所有下载好的文件导入到目标服务器,然后使用下述命令进行安装:
pip install --no-index --find-links=dir -r requirement.txt
注:离线下载时需保持包环境与安装环境一致,即一般情况下windows下导的包在windows上安装;linux下导的包在linux上安装.
实践过程中出现的问题:
出现上述问题,比较郁闷,在本地服务器上顺顺利利,但客户现场就是报错。
问题排查
排查项 | 命令 | 排查结果 |
---|---|---|
系统架构 | arch |
都是x86_64 |
系统core | cat /etc/redhat-release |
centos7.6(客户)/centos7.9(本地) |
python版本 | python |
3.6.3(客户)/3.6.5(本地)[本地重新创建3.6.3环境后发现,下载的离线包与之前的版本全部一致] |
pip | pip.__version__ |
9.0.1(客户)/21.2.2(本地)下载21.2.2离线安装包,然后在安装上述离线包,问题解决 |