利用PyInstaller打包exe文件


前言

平常我們通過Python寫完一些小腳本之后,如果使用不頻繁的話,一般會選擇在DOS界面直接跑腳本,或者在IDE中運行。但當我們需要頻繁使用某些腳本,或者在沒有Python環境的機器上也能順利運行時,我們需要怎么做呢?

一個好的辦法,就是將腳本打包成exe可執行文件,打包成exe有以下好處:
1,可以方便他人使用自己的腳本或工具
2,方便自己,使用時直接點擊執行exe文件即可

PyInstaller的安裝

在這里,主要和大家介紹一下Python通過PyInstaller打包exe的方法。

本人的環境:Python3.7.0、PyInstaller3.5

首先,對於PyInstaller的安裝,我們直接通過 pip 命令進行安裝即可,命令如下:

pip3 install PyInstaller==3.5

因為我電腦上裝了多個python版本,為了區分,所以使用的是 pip3 來安裝,大家按自己實際情況操作。

PyInstaller打包

安裝完成之后,進入待打包腳本(假設是TEST.py)的目錄下,執行打包命令即可。

pyinstaller -F TEST.py

PyInstaller打包

如上,打包成功后進入腳本目錄下,發現生成了exe文件和一些中間文件,我們所需要的exe文件在dist目錄下,其余的中間文件,可以刪掉。

打包生成的文件

生成自定義圖標的exe文件

如果在打包過程需要自定義exe文件的圖標,我們需要准備一個正常的后綴為 .ico 的圖標,不要直接去改后綴,可參考以下方法得到ico圖標。

下載圖片:https://www.iconfont.cn/ (阿里巴巴矢量圖標庫)、https://www.easyicon.net/
制作ico圖標:http://www.bitbug.net/http://www.faviconico.org/

准備好ico圖標后,執行命令:pyinstaller -F -i ico圖標路徑 py腳本路徑,如下供參考:

pyinstaller -F -i=D:\pycharm\test\favicon-201907310118208.ico D:\pycharm\test\TEST.py

打包結果

顯示打包成功之后,從輸出的信息中看到,的確對ico圖標進行了處理,為了進一步驗證,繼續到exe文件路徑下查看,發現好像不對呀,怎么還是顯示打包默認圖標呢?

查看圖標

出現以上顯示,可能是因為我們查看方式不對,當我們右鍵查看屬性便能看到自定義圖標成功了。

自定義圖標

可能遇到的問題

在安裝完PyInstaller,執行打包命令時,可能會遇到如下報錯:

D:\pycharm\test>pyinstaller -F TEST.py
418 INFO: PyInstaller: 3.5
419 INFO: Python: 3.7.0
419 INFO: Platform: Windows-10-10.0.17134-SP0
420 INFO: wrote D:\pycharm\test\TEST.spec
428 INFO: UPX is not available.
454 INFO: Extending PYTHONPATH with paths
['D:\\pycharm\\test', 'D:\\pycharm\\test']
454 INFO: checking Analysis
455 INFO: Building Analysis because Analysis-00.toc is non existent
458 INFO: Initializing module dependency graph...
460 INFO: Initializing module graph hooks...
462 INFO: Analyzing base_library.zip ...
Traceback (most recent call last):
  File "<string>", line 41, in <module>
  File "<string>", line 13, in walk_packages
  File "d:\python\installation\lib\pkgutil.py", line 130, in iter_modules
    for name, ispkg in iter_importer_modules(i, prefix):
  File "d:\python\installation\lib\pkgutil.py", line 149, in _iter_file_finder_modules
    import inspect
  File "d:\python\installation\lib\inspect.py", line 40, in <module>
    import linecache
  File "d:\python\installation\lib\linecache.py", line 11, in <module>
    import tokenize
  File "d:\python\installation\lib\tokenize.py", line 33, in <module>
    import re
  File "d:\python\installation\lib\re.py", line 143, in <module>
    class RegexFlag(enum.IntFlag):
AttributeError: module 'enum' has no attribute 'IntFlag'
Traceback (most recent call last):
  File "<string>", line 41, in <module>
  File "<string>", line 13, in walk_packages
  File "d:\python\installation\lib\pkgutil.py", line 130, in iter_modules
    for name, ispkg in iter_importer_modules(i, prefix):
  File "d:\python\installation\lib\pkgutil.py", line 149, in _iter_file_finder_modules
    import inspect
  File "d:\python\installation\lib\inspect.py", line 40, in <module>
    import linecache
  File "d:\python\installation\lib\linecache.py", line 11, in <module>
    import tokenize
  File "d:\python\installation\lib\tokenize.py", line 33, in <module>
    import re
  File "d:\python\installation\lib\re.py", line 143, in <module>
    class RegexFlag(enum.IntFlag):
AttributeError: module 'enum' has no attribute 'IntFlag'
3791 INFO: running Analysis Analysis-00.toc
3845 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
  required by d:\python\installation\python3.exe
4519 INFO: Caching module hooks...
4523 INFO: Analyzing D:\pycharm\test\TEST.py
5098 INFO: Processing pre-find module path hook   distutils
6265 INFO: Processing pre-find module path hook   site
6266 INFO: site: retargeting to fake-dir 'd:\\python\\installation\\lib\\site-packages\\PyInstaller\\fake-modules'
6402 INFO: Processing pre-safe import module hook   setuptools.extern.six.moves
Traceback (most recent call last):
  File "<string>", line 3, in <module>
  File "d:\python\installation\lib\site-packages\setuptools\__init__.py", line 5, in <module>
    import distutils.core
  File "d:\python\installation\lib\distutils\core.py", line 16, in <module>
    from distutils.dist import Distribution
  File "d:\python\installation\lib\distutils\dist.py", line 9, in <module>
    import re
  File "d:\python\installation\lib\re.py", line 143, in <module>
    class RegexFlag(enum.IntFlag):
AttributeError: module 'enum' has no attribute 'IntFlag'
pre-safe-import-module hook failed, needs fixing.

在網上查找解決方案,發現是因為環境下 enum34庫與Python3.7不兼容導致的報錯,另外該庫在Python3.7也不是必要的,因此我直接將其卸載,命令如下:

查看是否有enum34庫:pip3 show enum34
pip卸載enum34庫:pip3 uninstall enum34

卸載成功之后,再次執行打包命令,發現問題已解決,不會報錯了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM