如果想把python程序发布成.exe的话,一般我们都会使用pyinstaller, 怎么打包这里我就不说了。有时我们打包的结果会非常大,我最大的一次居然有900M......下面我就总结一下可以对发布结果瘦身的方法。

注意:下面的方法只对打包成多个文件夹(pyinstaller -D)的情况有效;对打包成一个.exe文件(pyinstaller -F)的情况无效。

使用from ... import ...进行引用,尽量减少不必要的引用(但是某些依赖比如opencv,所有的方法都在一个.pyd(78M)里面,所以即使只引用一个方法,整个.pyd都会引入);

尽量不使用anaconda;

尽量不用sys.setrecursionlimit(5000), 但是打包遇到recursion error时就只能用了;

直接对打包后的结果瘦身,移除不需要的依赖。

在这里详细说明一下第四种方法:

保证程序可以长时间运行,结束的太快可以在main函数里写个循环,多执行几次;

然后执行程序, 并在命令行里面输入tasklist / m | more >> .\include.txt,(此时程序需要在执行中) 这个命令会把所有运行程序的.dll依赖存到include.txt;然后搜索程序名,比如image_register, 结果如下:

image_register.exe 7752 ntdll.dll, kernel32.dll, KERNELBASE.dll,

WS2_32.dll, msvcrt.dll, RPCRT4.dll,

NSI.dll, api-ms-win-core-synch-l1-2-0.DLL,

python36.dll, VERSION.dll, SHLWAPI.dll,

GDI32.dll, USER32.dll, LPK.dll, USP10.dll,

ADVAPI32.dll, sechost.dll, ole32.dll,

OLEAUT32.dll, VCRUNTIME140.dll,

api-ms-win-crt-runtime-l1-1-0.dll,

ucrtbase.DLL,

api-ms-win-core-localization-l1-2-0.dll,

api-ms-win-core-processthreads-l1-1-1.dll,

api-ms-win-core-file-l1-2-0.dll,

api-ms-win-core-timezone-l1-1-0.dll,

api-ms-win-core-file-l2-1-0.dll,

api-ms-win-crt-string-l1-1-0.dll,

api-ms-win-crt-heap-l1-1-0.dll,

api-ms-win-crt-stdio-l1-1-0.dll,

api-ms-win-crt-convert-l1-1-0.dll,

api-ms-win-crt-math-l1-1-0.dll,

api-ms-win-crt-locale-l1-1-0.dll,

api-ms-win-crt-time-l1-1-0.dll,

api-ms-win-crt-environment-l1-1-0.dll,

api-ms-win-crt-process-l1-1-0.dll,

api-ms-win-crt-conio-l1-1-0.dll,

api-ms-win-crt-filesystem-l1-1-0.dll,

IMM32.DLL, MSCTF.dll, CRYPTSP.dll,

rsaenh.dll, CRYPTBASE.dll, _ctypes.pyd,

_socket.pyd, select.pyd, _bz2.pyd,

_lzma.pyd, pyexpat.pyd, _hashlib.pyd,

api-ms-win-crt-utility-l1-1-0.dll,

win32api.pyd, SHELL32.dll,

pywintypes36.dll, secur32.dll, SSPICLI.DLL,

pythoncom36.dll, uxtheme.dll, urlmon.dll,

api-ms-win-downlevel-ole32-l1-1-0.dll,

api-ms-win-downlevel-shlwapi-l1-1-0.dll,

api-ms-win-downlevel-advapi32-l1-1-0.dll,

api-ms-win-downlevel-user32-l1-1-0.dll,

api-ms-win-downlevel-version-l1-1-0.dll,

api-ms-win-downlevel-normaliz-l1-1-0.dll,

normaliz.DLL, iertutil.dll, WININET.dll,

USERENV.dll, profapi.dll,

cv2.cp36-win_amd64.pyd, MSVFW32.dll,

WINMM.dll, COMCTL32.dll, AVIFIL32.dll,

MSACM32.dll, AVICAP32.dll, COMDLG32.dll,

MFPlat.DLL, AVRT.dll, MF.dll, ATL.DLL,

ksuser.dll, MFReadWrite.dll,

multiarray.cp36-win_amd64.pyd, mkl_rt.dll,

umath.cp36-win_amd64.pyd,

lapack_lite.cp36-win_amd64.pyd,

_umath_linalg.cp36-win_amd64.pyd,

_mklinit.cp36-win_amd64.pyd,

fftpack_lite.cp36-win_amd64.pyd,

mtrand.cp36-win_amd64.pyd

这些.dll文件以及.pyd文件全在我们打包后的dist文件里,都是程序运行需要的,除了这些以外base_library.zip和.exe.manifest也是需要的,最后只要把不需要的移出来就可以瘦身啦。

python操作文件很方便:

def move_file_of_py_installer_by_tree(root_path, dll_names, exclude_path):

# tasklist / m | more

dll_names = dll_names + ['base_library.zip',

'image_register.exe',

'image_register.exe.manifest']

for root, dirs, files in os.walk(root_path):

for file in files:

if file not in dll_names:

old_path = os.path.join(root, file)

new_dir = root.replace(root_path, exclude_path)

if not os.path.exists(new_dir):

os.makedirs(new_dir)

new_path = os.path.join(new_dir, file)

shutil.move(old_path, new_path)

print(old_path)

dll_names 就是在include.txt里的依赖名字。

总结一下,如果使用了anaconda环境,那打包真的是胖,使用第四个方法真的可以瘦下来好多。我那个image_register瘦了500M.,还剩100M,其中78M是opencv。 ^ _ ^

python 打包 太大 精简_pyinstaller打包结果瘦身相关推荐

  1. MATLAB在MacBook上体积太大,如何给它瘦身?--卸载平时用不到的工具箱

    在使用MATLAB过程中发现它的体积异常的大,尤其是在MacBook中,简简单单就占到了二三十个G,简直不得了.在思考过后,发现可以通过卸载掉无用的工具箱来实现一定程度上的"瘦身" ...

  2. python 打包 太大 精简_极简 Python 打包指南

    本文由 qbit 整理自<pytest 测试实战·附录D 打包和发布 Python 项目>·Brian Okken 著·华中科技大学出版社 qbit 的实验环境 Windows 10 x6 ...

  3. Pyinstaller打包python文件太大?教你三个小技巧有效减小文件体积

    简介 有时候需要在未安装Python环境的平台上运行py程序,使用pyinstaller打包很方便,但打包后的可执行文件实在是太大了.原因在于打包时pyinstaller本就已经关联了很多的pytho ...

  4. python打包工具报错_Pyinstaller打包.py生成.exe的方法和报错总结

    Pyinstaller 打包.py生成.exe的方法和报错总结 简介 有时候自己写了个python脚本觉得挺好用想要分享给小伙伴,但是每次都要帮他们的电脑装个python环境.虽然说装一下也快,但是相 ...

  5. 同学,运维喊你来精简日志啦 - 日志瘦身方法论

    作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,<性能优化方法论>作者.<解锁大厂思维:剖析<阿里巴巴Java开发手册>>.<再学经 ...

  6. Python字节到大整数的打包与解包

    需求:处理一个拥有128位长的16个元素的字节字符串 将bytes解析为整数,使用 int.from_bytes() 方法,并像下面这样指定字节顺序: # 为了将bytes解析为整数,使用 int.f ...

  7. python打包exe不弹窗_Pyinstaller 打包exe教程及问题解决

    安装 pip insatll Pyinstaller 参数 pyinstaller -Fw main.py 参数 概述 -F,-onefile 打包一个单个文件,如果你的代码都写在一个.py文件的话, ...

  8. python训练模型太大怎么处理_如何极大效率地提高你训练模型的速度?

    原标题:如何极大效率地提高你训练模型的速度? How to Train Your Model (Dramatically Faster) 翻译 | 老赵 校对 | Peter_Dong 整理 | 菠萝 ...

  9. python训练模型太大怎么处理_趣味Python之如何降低过拟合风险

    可惜知乎编辑器里不能插入音频,麻烦诸位自己手动播放一下阅读此篇的官方钦定bgm--<脱掉>. 过拟合/欠拟合 之前的文章<从柏木由纪到卷积滤波器>介绍了卷积提取边缘特征的基本原 ...

最新文章

  1. R语言percent函数用百分比表示数值实战
  2. WinCE6.0的批量编译
  3. java中static代码块与非静态代码块
  4. spark 笔记 16: BlockManager
  5. 【蓝桥杯官网试题 - 历届试题】发现环(dfs+并查集,或无向图tarjan判环,无向环,或拓扑排序)
  6. 单片机复位电路电容一定用电解电容_学好单片机必须了解的10个电路
  7. a标签的href传递信息
  8. excel删除无尽空白行_【辅导员说】学好办公软件word、excel、ppt的意义
  9. java中rtsp转m3u8_记录:通过ffmpeg rtsp转 http m3u8
  10. fastjson php,Fastjson JSONPath
  11. c语言中逗号是什么字符,C语言中的逗号操作符
  12. python+flask搭建CNN在线识别手写中文网站
  13. 训练深度学习模型的小技巧
  14. 不同环境配置Django
  15. JEP:Java表达式分析器
  16. java新闻发布系统
  17. phpstudy快速搭建网站步骤(手把手教你搭建)
  18. Cox回归和HR值理解要点难点,实例讲解
  19. codeforces 1520E. Arranging The Sheep(1400)
  20. java调adobe打印_Java报表工具打印方案集锦 | 改变自己

热门文章

  1. 52 条 SQL 语句性能优化策略,建议收藏!
  2. JTXQ、JTT部标模拟终端使用说明 --1 模拟设备初始
  3. GAN生成对抗网络入门篇
  4. MetInfo标签函数及参数
  5. Smoothing Images
  6. 如何利用ThingJS开发物联网可视化小Demo?
  7. 〖Python语法进阶篇⑤〗 - 进程间的通信
  8. c# winform 爬虫 小工具开发
  9. postgresql数据库无法连接,提示 Is the server running on host localhost (127.0.0.1) and accepting TCP/IP conn
  10. linux 用户卸载搜狗输入法一生轻松