Pyinstaller 打包

pyinstaller 用来将python 程序打包成一个可执行程序.

之所以需要打包,主要是为了方便给别人使用. 因为不可能每个人电脑都装有python,而且python版本也可能不一样. 所以打包成一个可执行文件可以更方便使用.

安装

windows下需要安装pywin32

pip install PyInstaller

参数

有几个参数需要说明一下:

  • -F: 生成单个可执行文件,会将以来的dll等打包进去.
  • -w: 表示去掉控制台窗口,这在GUI界面时非常有用。不过如果是命令行程序的话加上这个选项会有问题.
  • -i: 表示可执行文件的图标
  • --clean: 打包前清除打包产生的一些临时文件. 如果没这个参数的话每次打包前就需要手动清除上一次产生的临时文件(删掉build目录等)
  • --distpath:表示打包可执行文件生成的目录,默认是在脚本当前目录(dist里).

控制台程序打包

这里演示的是Windows下的打包,pyinstaller.exe路径在虚拟环境和非虚拟环境位置是不一样的(平台也有差异),根据实际进行调整即可.


In [ ]:
# - *- encoding: utf-8 -*-

import os
import subprocess
import sys

cur_dir = os.getcwd()
pyinstaller_exe = os.path.join(os.path.dirname(sys.executable), 'pyinstaller.exe')

subprocess.check_call("{pyinstaller} -F --icon={icon}  --clean {script} --distpath {dist}".format(
    pyinstaller=pyinstaller_exe,
    icon=os.path.join(cur_dir, "ico.ico"),
    script=os.path.join(cur_dir, "console_demo.py"),
    dist=cur_dir
), shell=True, cwd=cur_dir)

界面程序打包

注意-w选项,不加的话会额外多一个控制台窗口.


In [ ]:
# - *- encoding: utf-8 -*-

import os
import subprocess
import sys

cur_dir = os.getcwd()
pyinstaller_exe = os.path.join(os.path.dirname(sys.executable), 'pyinstaller.exe')

subprocess.check_call("{pyinstaller} -w -F --icon={icon}  --clean {script} --distpath {dist}".format(
    pyinstaller=pyinstaller_exe,
    icon=os.path.join(cur_dir, "ico.ico"),
    script=os.path.join(cur_dir, "gui_demo.py"),
    dist=cur_dir
), shell=True, cwd=cur_dir)