前言
平常我們通過Python寫完一些小腳本之后态蒂,如果使用不頻繁的話,一般會選擇在DOS界面直接跑腳本费什,或者在IDE中運(yùn)行钾恢。但當(dāng)我們需要頻繁使用某些腳本,或者在沒有Python環(huán)境的機(jī)器上也能順利運(yùn)行時鸳址,我們需要怎么做呢瘩蚪?
一個好的辦法,就是將腳本打包成exe可執(zhí)行文件氯质,打包成exe有以下好處:
1募舟,可以方便他人使用自己的腳本或工具
2,方便自己闻察,使用時直接點擊執(zhí)行exe文件即可
PyInstaller的安裝
在這里拱礁,主要和大家介紹一下Python通過PyInstaller打包exe的方法琢锋。
本人的環(huán)境:Python3.7.0、PyInstaller3.5
首先呢灶,對于PyInstaller的安裝吴超,我們直接通過 pip 命令進(jìn)行安裝即可,命令如下:
pip3 install PyInstaller==3.5
因為我電腦上裝了多個python版本鸯乃,為了區(qū)分鲸阻,所以使用的是 pip3 來安裝,大家按自己實際情況操作缨睡。
PyInstaller打包
安裝完成之后鸟悴,進(jìn)入待打包腳本(假設(shè)是TEST.py)的目錄下,執(zhí)行打包命令即可奖年。
pyinstaller -F TEST.py
如上细诸,打包成功后進(jìn)入腳本目錄下,發(fā)現(xiàn)生成了exe文件和一些中間文件陋守,我們所需要的exe文件在dist目錄下震贵,其余的中間文件,可以刪掉水评。
生成自定義圖標(biāo)的exe文件
如果在打包過程需要自定義exe文件的圖標(biāo)猩系,我們需要準(zhǔn)備一個正常的后綴為 .ico 的圖標(biāo),不要直接去改后綴中燥,可參考以下方法得到ico圖標(biāo)寇甸。
下載圖片:https://www.iconfont.cn/ (阿里巴巴矢量圖標(biāo)庫)、https://www.easyicon.net/
制作ico圖標(biāo):http://www.bitbug.net/ 褪那、http://www.faviconico.org/
準(zhǔn)備好ico圖標(biāo)后幽纷,執(zhí)行命令:pyinstaller -F -i ico圖標(biāo)路徑 py腳本路徑
,如下供參考:
pyinstaller -F -i=D:\pycharm\test\favicon-201907310118208.ico D:\pycharm\test\TEST.py
顯示打包成功之后博敬,從輸出的信息中看到友浸,的確對ico圖標(biāo)進(jìn)行了處理,為了進(jìn)一步驗證偏窝,繼續(xù)到exe文件路徑下查看收恢,發(fā)現(xiàn)好像不對呀,怎么還是顯示打包默認(rèn)圖標(biāo)呢祭往?
出現(xiàn)以上顯示伦意,可能是因為我們查看方式不對,當(dāng)我們右鍵查看屬性便能看到自定義圖標(biāo)成功了硼补。
可能遇到的問題
在安裝完P(guān)yInstaller驮肉,執(zhí)行打包命令時,可能會遇到如下報錯:
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.
在網(wǎng)上查找解決方案已骇,發(fā)現(xiàn)是因為環(huán)境下 enum34庫與Python3.7不兼容導(dǎo)致的報錯离钝,另外該庫在Python3.7也不是必要的票编,因此我直接將其卸載,命令如下:
查看是否有enum34庫:pip3 show enum34
pip卸載enum34庫:pip3 uninstall enum34
卸載成功之后卵渴,再次執(zhí)行打包命令慧域,發(fā)現(xiàn)問題已解決,不會報錯了浪读。