pyinstaller:打包程序的工具,将python文件和所有依赖打包到文件夹、并生成可执行文件,也方便在其他电脑上使用程序。

官方文档:PyInstaller Manual — PyInstaller 6.15.0 documentation

安装:

pip install pyinstaller

打包程序:

pyinstaller py文件 各参数

常用参数:

pyinstaller 各参数
--icon="ico图标路径"应用程序的图标
--add-data "源路径;目标路径"

额外的文件一起打包到可执行文件中,也可在spec文件中配置

额外的文件在临时目录中。

--noconsole不显示控制台窗口
--onefile

打包到一个独立的二进制文件,打包环境下sys._MEIPASS查看,

程序运行时生成临时目录,程序结束临时目录删除

--windowedGUI项目(qt, tkinter)使用,否则会启用控制台
--workpath打包好的文件夹所在位置
--distpath

可执行文件(windows为.exe)所在位置,

以及所有临时文件所在位置。

--specpath配置文件(.spec)所在位置
--hidden-import打包额外python库
 --version查看pyinstaller版本信息
--help查看所有参数信息

注意:

默认打包后的文件夹保存在当前目录下,默认可执行文件和临时文件都在当前目录的dist目录下。

  • 使用--workpath但没有使用--distpath:打包后的文件夹在指定路径,而dist目录(可执行文件)仍在当前目录下。
  • 使用--onefile:dist目录下只有可执行文件没有临时文件。只在程序运行时生成临时目录(在其他路径)存放临时文件,程序结束则临时目录删除。
  • 使用--onefile且使用--add-data:dist目录下只有可执行文件没有临时文件。打包到可执行文件中的额外文件,只在程序运行时存在于临时目录,可设置为永久存在。
  • 使用--add-data "源路径;目标路径"但没有使用--onefile:(windows)中是分号";"隔开源路径和目标路径。额外文件都在dist目录下的临时目录中。可使用多个--add-data "源路径;目标路径"。

额外文件在程序中永久使用:

① 不使用--add-data参数,将文件拷贝到打包目录下,在程序中使用绝对路径读取。

② 使用--add-data参数,但不使用--onefile参数(该参数生成的临时目录会在程序结束时删除)。程序中读取文件的路径直接使用打包后的临时路径(sys._MEIPASS获取),默认和可执行文件在同一目录下。

③ 其他方法相对复杂此处忽略。

 查看临时目录路径:

打包环境下sys._MEIPASS

# 注意相关模块的导入
def default_path(filename):
    '''获取打包程序的运行时临时目录路径'''
    if hasattr(sys, '_MEIPASS'):
        path = sys._MEIPASS
    else:
        path = os.path.abspath(".")
    return path

# 举例 1:读取文件的路径直接为打包后的临时目录
tmp_path = default_path('data.txt')
filename = os.path.join(tmp_path, 'data.txt')
with open(filename, 'r') as file:
    ...

# 举例 2:pyside2的状态栏显示打包后的临时目录路径
class mywindow(QMainWindow):
    ...
    tmp_path = default_path('data.txt')
    self.statusbar.showMessage(f'程序运行时临时目录路径:{tmp_path}')
    ...

if __name__ == "__main__":
    ...
    window = mywindow()
    window.show()
    ...

打包举例:

# 不显示控制台窗口,打包到当前目录下,exe文件和临时文件都在当前目录的dist目录下
pyinstaller main.py --noconsole

# 不显示控制台窗口,打包到当前目录下,exe文件和临时文件都在当前目录的dist目录下, 应用程序有图标
pyinstaller main.py --noconsole --ico="G:/do.ico"

# 不显示控制台窗口,打包到当前目录下,只有exe文件在dist目录下,临时文件在程序运行时的临时目录(程序结束该目录删除),有图标
pyinstaller main.py --onefile --noconsole --ico="G:/do.ico"

# 不显示控制台窗口,打包到当前目录下,只有exe文件在dist目录下,临时文件在程序运行时的临时目录(程序结束该目录删除),有图标,
# data.txt打包到exe文件中,程序运行时在临时目录中,程序结束目录删除,该文件也不存在,可设置永久存在
pyinstaller main.py --onefile --noconsole --ico="G:/do.ico" --add-data "data.txt;."

# 不显示控制台窗口,打包到G:/aa目录下,exe文件和临时文件都在G:/aa/dist目录下,有图标
pyinstaller main.py --noconsole --ico="G:/do.ico" --workpath="G:/aa" --distpath "G:/aa/dist"

# 不显示控制台窗口,打包到G:/aa目录下,exe文件在G:/aa/dist目录下,临时文件在程序运行时的临时目录(程序结束该目录删除),有图标
pyinstaller main.py --onefile --noconsole --ico="G:/do.ico" --workpath="G:/aa" --distpath "G:/aa/dist"

# 不显示控制台窗口,打包到当前目录下,exe文件和临时文件都在当前目录的dist目录下,
# 两个额外文件都打包到可执行文件中,data.txt和do.ico都在dist目录下的临时目录中
pyinstaller main.py --noconsole --add-data "data.txt;." --add-data "do.ico;."


 

更多推荐