工作需要,使用Pyinstaller打包python程序为单文件exe。
看下面pyinstaller命令:
pyinstaller --noupx --paths C:/Users/yn/AppData/Local/Programs/Python/Python35/Lib/site-packages/PyQt5/Qt/bin --add-binary="UnRAR64.dll;." --add-data="11.png;." --add-data="logo.ico;." -F -w --icon=logo.ico test.py
首先看--paths C:/Users/yn/AppData/Local/Programs/Python/Python35/Lib/site-packages/PyQt5/Qt/bin
,我用到了PyQt5的库,所以我把这个路径加进去,否则是找不到PyQt5的链接库的。
--noupx
:是不适用upx,因为我使用了–upx-dir DIR之后,程序启动失败,说找不到相关qt的库(不知道什么原因),所以我这里去掉了upx。
--add-binary="UnRAR64.dll;."
:因为我程序用到了动态链接库UnRAR64.dll,所以我把这个加进去exe里面。前面是UnRAR64.dll的当前路径,后面是加到exe之后的路径,我选择是当前目录,所以我程序里面直接使用了“UnRAR64.dll”,说明在当前路径下去找。
--add-data="logo.ico;."
:程序里面用到了logo.ico来作为应用程序左上角的图标,所以我要把这个logo.ico加进去exe里面,否则打开程序之后,左上角不显示小图标。但是仅仅加这个选项是不够的,还要在程序代码里面加相关代码:
def resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
# PyInstaller creates a temp folder and stores path in _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
...
self.setWindowIcon(QIcon(resource_path("logo.ico")))
这样之后才能正常显示出来。但我不明白为什么UnRAR64.dll不用程序里面加相关代码就可以直接使用?
-F
:表示是单文件exe。
-w
:表示有窗体显示,因为我用了PyQt5。
--icon=logo.ico
:给这个应用程序添加图标,要不然就是python默认的图标。
更多详细内容,请去查看Pyinstaller文档和谷歌搜索相关内容。
Pyinstaller官方文档