背景
有同学希望在离线环境下使用光盘导入的方式获取pyinstaller,在线方式pip install即可,同时在Scripts目录下生成pyinstaller.exe即可在命令行中调用pyinstaller命令。但离线方式需要考虑离线包的下载(包括依赖包,麻烦就在于依赖包)和安装顺序(依赖的顺序是特定的,所以安装各依赖包的顺序有讲究,否则会报错,默认pip install A是先在已安装的库中寻找A是否存在,不存在则确认依赖的B、C、D是否已安装,如果没有安装则会自动联网下载,离线状态下会多次尝试联网Retry失败后会跳过本次安装,安装失败)
步骤
pip install可安装tar.gz/whl格式的包
python 包目录/setup.py install可安装文件夹形式的包
1. 下载
报错找不到匹配的版本,是因为https协议,添加信任主机–trusted-host mirrors.aliyun.com即可(源的名字可能需要更换)
下载后会有tar.gz和whl格式
目标就是要pip install pyinstaller-4.3.tar.gz成功,但测试发现,其他包都可以正常安装依赖,唯独执行最后这个包的安装时报错:
但如果联网状态,则执行该命令正常,所以这有Bug不是简单的通过pip install各个依赖包就能解决。
经过查阅资料,从https://www.lfd.uci.edu/~gohlke/pythonlibs/(非官方包下载网址)下载
4.3版本的pyinstaller的whl包,替换掉原tar.gz包。
2. 安装
我写了README.txt如下
#编译
env:py3.7.4 anaconda3 environment called "py3.7"
compile:
step1: conda activate py3.7
step2: cd packages\
step3: for %i in (*.whl) do pip install %i(会有报错ERROR,等待自动结束即可)
step3_1: 对除pyinstaller外的安装包安装错误进行分别单独pip install xx.whl
step4: pip install future-0.18.2.tar.gz
step5: pip install pefile-2021.5.24.tar.gz
step6: pip install pyinstaller-4.3-py3-none-any.whl(保证这个包是最后安装的)
exe:执行完step6后可在python安装根目录的Scripts下找到pyinstaller.exe
#EXE
“编译后的exe”目录下是我编译好的exe,可copy放于系统路径下后直接在cmd中调用pyinstaller命令。
编译成功后验证,在cmd输入pyinstaller,且通过where pyinstaller验证该exe是不是本次编译生成的。
补充
离线包下载也可通过先创建一个python虚拟环境,然后只pip install 目标包,然后freeze导出为requirements.txt(文件名可自定义),再通过:
pip download -d packages -r requirements.txt
下载整个环境需要的离线包到packages 目录下,执行对照requirements.txt的离线安装:
pip install --find-links=packages(包目录) -r requirements.txt
可用解压缩软件查看whl文件,内部有exe说明这个whl不是跨平台的,需要下载对应版本的whl文件,而通过python xx/setup.py install会根据当前平台借用当前平台的python解析器进行编译安装包,所以适用于国产化的python包离线安装。
结论
一个简单的离线包安装折腾三个小时,根本原因还是原包有Bug,通过不同的包文件格式安装的结果不同很不应该,经常有pip install指定版本在线找不到,但去官网下载对应版本的离线包可以安装的配管Bug。