前言
平常我們通過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
如上,打包成功后進入腳本目錄下,發現生成了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
卸載成功之后,再次執行打包命令,發現問題已解決,不會報錯了。