我在网上看了很多的文献,掉进了很多坑。下面,自己总结成大白话的步骤,方便大家来操作。
【【【准备工作】】】
1.自己写好的主程序:my_assistant.py (不能为中文名字,否则会失败)
2. 将py转变成pyd的程序:build_pyd.py(自己创建一个build_pyd.py,粘贴下图片中代码)
from distutils.core import setup
from Cython.Build import cythonize
setup(
name='any words.....',
ext_modules=cythonize("my_assistant.py"),
)
# 注意!
①. 我是python3.7,所以是需要安装 Visual Studio 2019;python3.5以上的都可以用2019版,其他python版本请自行百度;
②.安装图片上的这两个,python 本机开发工具默认不选,自己选上!
3.面向客户的程序:client_service.py (自己创建一个client_service.py,粘贴下面代码;需要注意的是:如果my_assistant.py引用了其他包,比如import time, import os 等等,这些都要在本程序前面列示!下面代码中仅以import time 作为示例。)
from my_assistant import *
import time # 根据自己实际情况填写
if __name__ == '__main__':
if args.input is None:
print('找不到对象')
else:
my_assistant(args.input, args.output)
提示:① 本文运用 pyinstaller 打包成 exe 。
② 不知道为什么这块代码会报错,但是能正常运行主程序(my_assistant.py),所以暂且忽略了。
4.自己做好的图标 (一定是ico格式的图片,我准备的是 00001_7.ico 文件)
5.把这些放进一个文件夹里,我是在桌面创建一个叫 ‘我的小助手’ 的文件夹,把上述1-4的内容都放了进去。
【【【 准备工作结束后,在管理员模式下运行 windowsPowerShell,开始运行下面的代码】】】
第一步:将主程序的 包路径包含:site-packages 的单独提出来(就是网上文献所谓的第三方包的文件夹拷贝过来)
提问:什么是第三方包?
答:以我为例,我自己是先装的Anaconda3后安装的Pycharm。我理解是引用的包不在Anaconda3\Lib 路径下,都算第三方包,都需要找到路径后,复制、粘贴到‘我的小助手’文件夹中。提示下,需要将使用的整个第三方包文件夹复制粘贴过来,不要只复制粘贴你所使用的第三方单个py文件。
第二步:复制粘贴 build_pyd.py ; client_service.py 到我的小助手的文件夹里面
(再次提示!client_service.py里面包含my_assiatant.py引用的各种包,比如上面的import time)
第三步:在windowsPowerShell输入代码: cd C:\Users\x\Desktop\我的小助手
第四步:在windowsPowerShell输入: python build_pyd.py build_ext --inplace
第五步:生成文件 xxx.cp35-win_amd64.pyd ,手动将其重命名为xxx.pyd
第六步:手动删除build文件夹; 删除my_assistant.py(我删了,不知道不删好使不)
第七步:输入: pyinstaller -p docx\api.py -i 00001_7.ico client_service.py
#提示 ①pyinstaller -p之间有空格!
②因为自己引用了docx\api.py 第三方包,所以这么写代码,请根据你自己实际情况填写此处代码!
# 因为最后生成的文件太大,所以我没写上 -F,写上后,最后生成的是一个exe程序,不是一个里面什么都有的文件夹。
第八步:在生成的dist文件夹里面找 client_service.exe
【【【 后续打包报错,持续更新...】】】
问题1:打包包含cv2库的代码,报错信息如下:ImportError: OpenCV loader: missing configuration file: [‘config.py‘]. Check
解决方法:在原来代码的最后,加上
--paths="C:\ProgramData\Anaconda3\Lib\site-packages\cv2"(具体路径根据自己电脑定)
# 根据前面的例子,在最后加上一段代码
pyinstaller -p docx\api.py -i 00001_7.ico client_service.py --paths="C:\ProgramData\Anaconda3\Lib\site-packages\cv2"
如果最后打包打开 exe程序,还是一闪而过,上述代码没有起到效果,用手机录视频,发现报错的最后几行如下:
ImportError: OpenCV loader: missing configuration file: ['config.py']. Check OpenCV installation.
复制、粘贴 cv2文件里的所有内容到 打包成exe 同级目录下的 cv2文件夹里。
问题2:打包paddleocr库,报错信息如下:
File "subprocess.py", line 800, in __init__
File "subprocess.py", line 1207, in __execute__child
FileNotFoundError: [WinError 2] 系统找不到指定的文件。
解决方法:注释掉 paddle\dataset\image.py 的几行代码,之后再进行打包(多次确认有没有注释掉,因为属于库的代码,所以会提示修改不了等情况),具体方法参考这篇文章的 “ 二、关闭线程(很重要)”部分,地址:成功解决-PaddleOCR打包exe--Pyinstaller_aqqwvfbukn的博客-CSDN博客_paddleocr打包一、首先在虚拟环境中能够成功运行,二、关闭 多进程,否则当运行exe时电脑会有10多个 main.exe 进程,电脑内存占用直接90%。找到所在环境下的 image.py 文件我的是“D:\virtualenv\OCR\Lib\site-packages\paddle\dataset\image.py”把这一部分代码 注释掉```pythonif six.PY3: import subprocess import sys import_cv2_proc = subprhttps://blog.csdn.net/aqqwvfbukn/article/details/120553124?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164924304616782184624292%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164924304616782184624292&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-120553124.142%5Ev5%5Epc_search_insert_es_download,157%5Ev4%5Econtrol&utm_term=%E6%89%93%E5%8C%85paddleocr+subprocess.py&spm=1018.2226.3001.4187
问题3:打包paddleocr库,报错信息如下:
File "paddle\fluid\core.py", line 294, in <module>
File "paddle\fluid\core.py", line 256, in <module>
ImportError: DLL load failed: 找不到指定的模块。
解决方法:进行以下四步操作:1.复制、粘贴 paddle文件夹下的所有.py文件 到打包成exe 同级目录下的 paddle文件夹下。2.复制、粘贴 paddle\fluid 文件夹 到打包成exe 同级目录下的 paddle文件夹下。3.复制、粘贴 paddle\distributed 文件夹 到打包成exe 同级目录下的 paddle文件夹下。4.复制、粘贴 paddle\libs 里的所有文件 到打包成exe 同级目录下。
问题4:打包paddleocr库,报错信息如下:
File "ppocr\utils\e2e_utils\pgnet_pp_utils.py", line 25, in <module>
ModuleNotFoundError: No module named 'extract_textpoint_slow'
解决方法:进行以下两步操作:1.复制、粘贴 paddleocr\ppocr 文件夹 到打包成exe 同级目录下。2.复制、粘贴 paddleocr\ppstructure 文件夹 到打包成exe 同级目录下。(注意:这两步都不需要在exe 同级目录下创建paddleocr,直接复制粘贴ppocr和ppstructure文件夹即可。)
问题5:打包过程中提示:
=============================================================
A RecursionError (maximum recursion depth exceeded) occurred.
For working around please follow these instructions
=============================================================
1. In your program's .spec file add this line near the top::
import sys ; sys.setrecursionlimit(sys.getrecursionlimit() * 5)
2. Build your program by running PyInstaller with the .spec file as
argument::
pyinstaller myprog.spec
3. If this fails, you most probably hit an endless recursion in
PyInstaller. Please try to track this down has far as possible,
create a minimal example so we can reproduce and open an issue at
https://github.com/pyinstaller/pyinstaller/issues following the
instructions in the issue template. Many thanks.
Explanation: Python's stack-limit is a safety-belt against endless recursion,
eating up memory. PyInstaller imports modules recursively. If the structure
how modules are imported within your program is awkward, this leads to the
nesting being too deep and hitting Python's stack-limit.
With the default recursion limit (1000), the recursion error occurs at about
115 nested imported, with limit 2000 at about 240, with limit 5000 at about
660.
解决方法:用笔记本打开.spec,输入以下内容,之后保存。8000还是报错的话就继续调大数字。
import sys
sys.setrecursionlimit(8000)
效果如图:
修改后,不要删除自动生成的build文件夹和dist文件夹。在windowsPowerShell输入代码:
pyinstaller client_service.spec
问题6:No module named 'framework_pb2'
问题7:ModuleNotFoundError: No module named XXX
到 XXX\Lib\site-packages文件夹下或 XXX\Lib文件夹下,找到相应名字的文件夹,复制粘贴到自己打包程序的文件夹下面。