Pyinstaller 可以用来将 python 程序打包成独立可执行程序,让 python 程序能在没有装python环境的机器上运行。有时候用python写了一个小程序,但是共享给别人时,别人电脑需要装python才能运行,这时候pyinstaller就很有用了。
本人所用环境为:Win10 + python3.6
Pyinstaller 的安装很简单,用 pip
安装就可以:
pip install pyinstaller
安装完在命令行输入:
pyinstaller
出现以下画面表示安装成功。
使用 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
如果没有错误发生,目录下会生成 build
和 dist
两个目录,可执行程序在 dist
中。
有时候我们的程序会用到图片,但是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')