pyinstaller打包結(jié)果瘦身

如果想把python程序發(fā)布成.exe的話,一般我們都會使用pyinstaller, 怎么打包這里我就不說了。有時我們打包的結(jié)果會非常大,我最大的一次居然有900M......下面我就總結(jié)一下可以對發(fā)布結(jié)果瘦身的方法。
注意:下面的方法只對打包成多個文件夾(pyinstaller -D)的情況有效;對打包成一個.exe文件(pyinstaller -F)的情況無效。

  1. 使用from ... import ...進行引用,盡量減少不必要的引用(但是某些依賴比如opencv,所有的方法都在一個.pyd(78M)里面,所以即使只引用一個方法,整個.pyd都會引入);
  2. 盡量不使用anaconda;
  3. 盡量不用sys.setrecursionlimit(5000), 但是打包遇到recursion error時就只能用了;
  4. 直接對打包后的結(jié)果瘦身,移除不需要的依賴。

在這里詳細說明一下第四種方法:

  1. 保證程序可以長時間運行,結(jié)束的太快可以在main函數(shù)里寫個循環(huán),多執(zhí)行幾次;
  2. 然后執(zhí)行程序, 并在命令行里面輸入tasklist / m | more >> .\include.txt,(此時程序需要在執(zhí)行中) 這個命令會把所有運行程序的.dll依賴存到include.txt;然后搜索程序名,比如image_register, 結(jié)果如下:
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里的依賴名字。

總結(jié)一下,如果使用了anaconda環(huán)境,那打包真的是胖,使用第四個方法真的可以瘦下來好多。我那個image_register瘦了500M.,還剩100M,其中78M是opencv。 ^ _ ^

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容