Pyinstaller 使用+打包图片方法

0. 前言

Pyinstaller 可以用来将 python 程序打包成独立可执行程序,让 python 程序能在没有装python环境的机器上运行。有时候用python写了一个小程序,但是共享给别人时,别人电脑需要装python才能运行,这时候pyinstaller就很有用了。

本人所用环境为:Win10 + python3.6

1. 安装

Pyinstaller 的安装很简单,用 pip 安装就可以:

pip install pyinstaller

安装完在命令行输入:

pyinstaller

出现以下画面表示安装成功。

2. 使用

使用 pyinstaller 打包 python 文件时,先进入你文件所在的目录,打开命令行。假设你的文件名为 test.py,则使用以下的命令打包:

pyinstaller [--options] test.py

其中的 [--options] 是打包的选项,官方有详细的说明:Using Pyinstaller

这里列举一些常用的选项:

选项 说明
-F, --onefile 只创建一个单独的可执行文件(否则会生成很多依赖文件)
-c, --console, --nowindowed 创建一个命令行程序(就是那个小黑框),这是默认的选项
-w, --windowed, --noconsole 不弹出命令行,如果你写的是图形界面的程序可以使用此选项
-i,–icon 为程序指定一个图标,需要跟上图标的路径

比如说我要打包一个单独文件、不弹出命令行,以 icon.ico 为图标的程序,则输入如下命令:

pyinstaller -F -w test.py -i icon.ico

如果没有错误发生,目录下会生成 builddist 两个目录,可执行程序在 dist 中。

3. 打包图片

有时候我们的程序会用到图片,但是pyinstaller打包出来的程序是不包含图片的,这时候程序就没办法正常运行,或者需要带着几张图片才能运行,这对于强迫症来说是不能接受的。

网上找了一下资料,发现有一个解决办法,可以参考以下两篇博客:

  1. Pyinstaller打包exe附带图片的方法
  2. pyinstaller 打包图片资源文件

里面的方法我试过了,不知道是我操作出了问题还是什么,这个方法根本不能用,只是把路径写成绝对路径,在本机能用,到其他电脑就不行了。

于是我继续寻找,发现了另一个方法:pyinstaller打包——图片资源无法显示问题

这个方法可以用了,但是博客里面提供的代码会为每一张图片生成一个 .py 文件,引入的时候也需要一张张的引入,对于需要使用多张图片的来说,有点麻烦,也不够优雅。

于是我在原博客代码的基础上进行了一点小改进,再重申一下,以下代码改自博客:pyinstaller打包——图片资源无法显示问题

1. Pic2py.py : 图片转为.py

# -*- coding: utf-8 -*-
# @Time    : 2018/6/6 18:29
# @Author  : Octan3
# @Email   : [email protected]
# @File    : Pic2py.py
# @Software: PyCharm
 
import base64
 
def pic2py(picture_names, py_name):
    """
    将图像文件转换为py文件
    :param picture_name:
    :return:
    """
    write_data = []
    for picture_name in picture_names:
	    filename = picture_name.replace('.', '_')
	    open_pic = open("%s" % picture_name, 'rb')
	    b64str = base64.b64encode(open_pic.read())
	    open_pic.close()
	    # 注意这边b64str一定要加上.decode()
	    write_data.append('%s = "%s"\n' % (filename, b64str.decode()))

    f = open('%s.py' % py_name, 'w+')
    for data in write_data:
    	f.write(data)
    f.close()
 
if __name__ == '__main__':
    pics = ["icon.ico", "weixin.gif", "alipay.gif"]
    pic2py(pics, 'memory_pic')	 # 将pics里面的图片写到 memory_pic.py 中
    print("ok")

生成的memory_pic.py包含的内容如下:

2 在程序中引用

from memory_pic import *		# 无需像原博客那样一个个导入

def get_pic(pic_code, pic_name):
    image = open(pic_name, 'wb')
    image.write(b64decode(pic_code))
    image.close()

get_pic(icon_ico, 'icon_ico')
# 在这里使用图片 icon.ico
os.remove('icon.ico')

你可能感兴趣的:(Python)