Python打包工具pyinstaller

标签: 无 分类: 未分类 创建时间:2022-04-25 12:48:46 更新时间:2024-11-15 10:49:43

前言

我使用了 Detect It Easy 这个工具,查出了一个朋友发给我的一个exe程序使用的是PyInstaller进行打包的,于是我就尝试进行了程序的破解。

1.编译

经过上面的Detect工具进行查看,我发现了软件是使用 PyInstaller 编译的,于是我就开始尝试进行解码。

1
2
3
4
## 安装
pip install pyinstaller
## 打包
pyinstaller -F main.py
参考文章:
1.PyInstaller用法
2.Python PyInstaller安装和使用教程 这里对多个PyInstaller的参数进行了说明,还给了一个链接mysql的例子。
3.别再问我怎么Python打包成exe了 Pyinstaller -F setup.py 打包exe;Pyinstaller -F -w setup.py 不带控制台的打包;Pyinstaller -F -i xx.ico setup.py 打包指定exe图标打包
4.Python PyInstaller 打包成 Win、Mac 应用程序(app / exe) 可以在 Windows、Mac 和 Linux 上使用,但是并不是跨平台的,而是说要是希望打包成 .exe 文件,需要在Windows 系统上运行 PyInstaller 进行打包工作;打包成 Mac App,需要在 Mac OS 上使用,Linux 也一样,不能在一端上打另外两段的包,还有 Mac m1 的打包不能给 Mac intel 的使用,相反也一样。

问题

(1) No module named ‘src’
我在安装pyinstaller的时候,遇到了这个问题。

【尝试】
有文章说是增加系统变量,但是我这里是使用 pip install 安装包的时候报错了,应该不适合。后来发现pyinstaller不支持py38,尝试使用 virtualenv 创建虚拟环境,结果报错:RuntimeError: failed to find interpreter for Builtin discover of python_spec=’python3.6’

【解决】
最后我直接跳过了我原先安装的 python 3.8.2,安装了python 3.10,解决了这个问题。

参考文章:
1.Python3.6 error: ModuleNotFoundError: No module named ‘src’ 增加系统路径(测试成功)
2.Add support for Python 3.8 这里讨论了pyinstaller不支持38
3.Converting a python 3.8 file to .exe 这里提到了使用virtualenv创建36环境
4.virtualenv安装并指定python版本 在windows中,不同的python是可以安装在不同的目录中,但是你系统使用哪个版本,就把哪个版本的路径添加到系统的环境变量最前面即可。刚才的例子里看到我目前使用的主版本是3.7.3,这个时候如果想要使用python3.8来创建虚拟环境的话,就需要告知3.8版本的实际路径
5.python3.8安装pyinstaller库_模块:pyinstaller库的安装与使用 pip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz 这个我尝试了没有用
6.python3.8与pyinstaller冲突问题解决

(2) DLL load failed while importing _ufuncs:
这个在打包一个含有numpy和scipy模块的项目时,打包不报错,但是打包完成的exe文件无法执行,总是出现这个错误,

1
2
3
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d

【尝试】
(1) 我尝试通过重新安装numpy,然后进行打包,结果还是不行。首先我之前直接通过pip install下载安装的numpy没有mkl,在下载时需要首先在官网下载numpy+mkl.whl文件,然后下载scipy模块

1.运行:pip uninstall numpy

2.然后运行:pip install “numpy-1.16.4+mkl-cp37-cp37m-win_amd64.whl”

3.运行:pip uninstall scipy

4.然后pip install “scipy-1.4.0-cp37-cp37m-win_amd64.whl”

需要注意的是numpy版本要和scipy版本相同,

【解决方案】
经过多次尝试,重新安装numpy和scipy都不行,最后我尝试升级pyinstaller,将pyinstaller升级到了 pefile-2023.2.7 pyinstaller-5.8.0 ,重新进行打包,竟然成功运行了项目,问题也算是解决了。

参考文章:
1.python使用scipy报错:“ImportError: DLL load failed: 找不到指定的模块”的解决方案 这是linux解决方法
2.pyinstaller 打包后运行报ImportError: DLL load failed: 找不到指定的模块 解决方法在pyinstaller的一个issue中,出现这个问题的原因是skimage、sklearn、scipy必须在torch前import,否则会有共享库的冲突导致报错。
3.记一次Pyinstaller打包缺失.dll解决方式,ImportError: DLL load failed while importing blspy: 动态链接库(DLL)初始化例程失败。 将缺失的dll放到打包后的目录下
4.ImportError: DLL load failed while importing _multiarray_umath: 找不到指定的模块(pyinstaller打包的问题) 将dist目录下带有mkl的dll移动到numpy/core目录下,试着运行了下,竟然成功了!
5.Python scipy module import error due to missing ._ufuncs dll 使用了:conda remove icc_rt –force,conda install icc_rt –no-deps,但是我没有安装conda这个库。
6.Import errors when using cx_Freeze with specific scipy modules 1.copy all the numpy DLLs (from c:\Python27\Lib\site-packages\numpy\core), regardless of using scipy 13 or 14。2.add the following to my code:
7.import scipy.misc 出现DLL load failed: 找不到指定的模块错误
8.#根本上解决# 使用 Pyinstaller 打包后 出现 lib not found 错误 将pyinstaller升级到和python对应的版本,这个很难做到,所以直接使用 pip install –upgrade 包名命令,将pyinstaller和用到的python库全部升级到最新的版本,实在不行就使用pip-review –local –interactive命令升级所有包

(3) 计算机缺少 api-ms-win-core-path
在win7系统上运行pyinstaller打包的程序,报错。

【解决方法】
我用的是python3.10进行的打包,已经不支持win7了。

参考文章:
1.pyinstaller打包后在win7不能运行提示缺少api-ms-win-core-path-l1-1-0.dll 最后发现是因为Python3.9已经不再支持Win7了,最后使用Python3.8.6来编译解决了这个问题。
2.解决win 7打开ie提示api-ms-win-core-path-l1-1-0.dll丢失的方法 安装根据系统选择vc_redist.x64或者vc_redist.x86进行安装

2.反编译

知道了是pyinstaller打包的程序,这里就尝试着进行编译试试。

参考文章:
1.超详细Pyinstaller打包exe+反编译Pyinstaller打包的exe教程+防止反编译教程 这里还有提供了pyc在线发编译的链接,不过好像要关注扫码,也是从写py脚本,编译成exe,然后在反编译回来。
2.PyInstaller Extractor安装和使用方法 这个反编译出来的和我的差不多,但是还有些不太明白的地方。
3.Python 反编译 pyinstaller打包的exe文件 从0开始 这篇文章非常的详细,关于未加密的有些疑惑就可以解开了,关于破解那些文件,不破解那些文件,都有说明。而且你可以从这篇文章中,能知道到底如何才能知道到底是覆盖8字节,还是16字节,这个挺实用的。
4.谈谈 Pyinstaller 的编译和反编译,如何保护你的代码 这里说了加密和不加密的两种方法,从编译产出的文件和反编译后的文件进行对比,查看字节数,但是这里用了16字节,还是不准确的。

1.解包exe程序

下载pyinstxtractor.py,使用python命令进行解包,会生成main.exe_extracted文件夹,如果python的版本没有错误的话,该文件夹里面会有很多的没有后缀的文件,还有些dll文件依赖等,以及PYZ-00.pyz_extracted子文件夹。

1
python pyinstxtractor.py xx.exe

2.复制字节

找到要破解的文件,一半是没有后缀的文件,这个要盲猜了,如果文件较多的话,然后修改后缀为pyc文件。将struct中的前几个字节复制到这个文件中,有人说是8字节,有人说是16字节。这里应该根据实际情况做,只需要用 Hex Editor 编译器打开struct文件,和要反编译的文件,对比前几个字节,把不同的反编译文件中没有的前几个字节补上就可以了。

3.uncompyle6

下载安装相应版本的uncomyle6,使用 uncompyle6 工具,解码未加密的.pyc文件。

1
2
3
4
## 安装
pip install uncompyle6
## 编译
uncompyle6 -o pcat.py pcat.pyc

问题

(1) UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 2-3: ordinal not in range(128)
这个错误主要是因为源码用了python3编译,而我用了python2进行解码,换成python3就好了。

(2) 引入相对路径
对于python还不是很熟的我来说,还是有问题的。这里注意,要是用 sys.path.append(‘C:\Users\ph\Desktop\破解\main’) 将当前路径加入到路径中,才能找到模块。

也可以直接倒入当前路径,模块下面要有一个 init.py 文件,就算是空的也可以。

1
2
3
4
# -*- coding:utf-8 -*-
import sys
sys.path.append('.')
from Utils import mssql_helper

注意其中的目录结构,main.py同级目录下有一个 Utils 文件夹,文件夹下有一个模块mssql_helper,里面写了一个Class类,还有一个就是空的 init.py 文件。

参考文章:
1.相对导入问题解决,ImportError:attempted relative import with no known parent package 使用 sys.path.append(‘/home/user/fqm/Project’) 倒入了相对路径,
2.python引入同一目录下的py文件 在目录下有init.py文件,在admin.py文件中加一行:from . import dealcode(如果要引入同一目录下的dealcode.py文件中的一个类Hello,在admin.py文件中加一行:from .dealcode import Hello)。这个点,我尝试了不行。
3.ModuleNotFoundError: No module named ‘xxx’可能的解决方案大全 1.module包没安装;2.忘了import;3.没有init.py文件;4.安装的第三方module包的版本不对;5.自建的包名与第三方安装的包名相同,导致import包的时候导错了包;6.没设置PYTHONPATH环境变量;7.自建的module包所在路径不在PYTHONPATH下;
4.python不能import当前目录下的文件_python引入同一目录下的py文件

(2) 丢失api-ms-win-crt-runtime-l1-1-0.dll,解决方案。
这里在windows server 2012 r2上运行exe的时候,出现了这个问题。我尝试按照参考文章1,单独安装 这个dll,结果不行。

【解决】
下载 Microsoft Visual C++ Redistributable latest supported downloads,重新安装Microsoft Visual C++ Redistributable,就可以了。

参考文章:
1.丢失api-ms-win-crt-runtime-l1-1-0.dll,解决方案 这里是下载了 dll, 然后使用了regsvr32 进行了注册,64位注册 :%systemroot%\SysWoW64\regsvr32
2.如何修复Api-ms-win-crt-runtime-l1-1-0.dll错误? 安装或重新安装微软Visual C ++可重新分配软件包,这个解决了我的问题。
3.How to use the Regsvr32 tool and troubleshoot Regsvr32 error messages

(3) windows安装了pyinstaller,还是提示找不到程序
我在windows上,使用pip命令,成功安装了pyinstaller,但是运行的时候,还是提示找不到。

后来我卸载的时候发现,这个路径不对。我在安装pyinstaller的时候,使用的全局安装,所有用户都可用,所以最后的安装路径就是:C:\Program Files\Python310,环境变量也就是这个路径,但是使用pip安装的时候,安装到了:c:\users\phkj\appdata\roaming\python\python310,用户目录中,这个目录并不在环境变量PATH中。

【解决】
解决方法就是将环境变量添加进去。

1
2
C:\users\phkj\appdata\roaming\python\python310\
c:\users\phkj\appdata\roaming\python\python310\scripts

配置好环境变量之后,如果使用vscode,最好将全部的vscode窗口都关闭,然后再打开,我尝试了新建一个终端的方法,还是不行。


(4) No module named ‘pymssql’
系统打包之后,运行exe出现这个问题。我重新安装了 pymysql ,重新执行打包,最后生成的exe还是找不到这个包的依赖。我把python卸载,重新安装,也是同样的问题。python安装的时候,有两种安装方法,一种就是直接安装,所有的都是默认的配置,路径也是默认的路径,都安装在了用户目录下面。另外一种就是自定义安装,可以选择是否为全部的用户安装,还可以修改安装路径,我尝试了两种方式,都有问题。

1
pip install pymysql

【解决】
后来我把python卸载,在安装的时候:
1,选择了自定义安装
2,选择了将python添加入环境变量中
3.并且在自定义的时候,修改了默认的python安装路径为:C:\Soft\python
4.重新执行了安装pyinstaller 和 pymssql
5.然后在执行 pyinstaller命令时,增加了 –paths 参数,指向了python的安装路径

1
pyinstaller -F .\main.py --paths C:\Soft\python

(5) No such file or directory: ‘C:\Program Files\Python310\python310.dll’
我在win11 上安装新版的python 3.10.7,选择了自定义安装,修改了安装路径到:C:\Soft\python\,之后安装pyinstaller执行py打包成exe文件,结果就报了这个错误,我难道不能修改默认的安装路径吗?

【解决方法】
我重新执行了pyinstaller命令,增加了 –paths 参数

1
pyinstaller -F .\main.py --paths C:\Soft\python

(5) unsupported format character ‘’’ (0x27) at index 43
主要是这个LIKE问题,我将一个% 改为%%,结果报错:not all arguments converted during string formatting

1
2
3
4
## 刚开始
syh_rows = mssql_connector.ExecQuery("SELECT * FROM [jc03a] WHERE [编号] LiKE 'HKH%' ORDER BY [试验号] ASC " % cur_date)
## 修改
syh_rows = mssql_connector.ExecQuery("SELECT * FROM [jc03a] WHERE [编号] LiKE 'HKH%%' ORDER BY [试验号] ASC " % cur_date)

【解决方法】
想要以HKH开头的sql语句,如下编写:

1
syh_rows = mssql_connector.ExecQuery("SELECT * FROM [jc03a] WHERE [试验号] LiKE '%s%%' AND [试验日期]='%s' ORDER BY [试验号] ASC " % ('HKH',cur_date))
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。