pyinstaller打包结果瘦身

如果想把python程序发布成.exe的话,一般我们都会使用pyinstaller, 怎么打包这里我就不说了。有时我们打包的结果会非常大,我最大的一次居然有900M......下面我就总结一下可以对发布结果瘦身的方法。
注意:下面的方法只对打包成多个文件夹(pyinstaller -D)的情况有效;对打包成一个.exe文件(pyinstaller -F)的情况无效。

  1. 使用from ... import ...进行引用,尽量减少不必要的引用(但是某些依赖比如opencv,所有的方法都在一个.pyd(78M)里面,所以即使只引用一个方法,整个.pyd都会引入);
  2. 尽量不使用anaconda
  3. 尽量不用sys.setrecursionlimit(5000), 但是打包遇到recursion error时就只能用了;
  4. 直接对打包后的结果瘦身,移除不需要的依赖。

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

  1. 保证程序可以长时间运行,结束的太快可以在main函数里写个循环,多执行几次;
  2. 然后执行程序, 并在命令行里面输入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。 ^ _ ^

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容