Pyinstaller 使用+打包圖片方法
阿新 • • 發佈:2018-12-16
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
如果沒有錯誤發生,目錄下會生成 build
和 dist
兩個目錄,可執行程式在 dist
中。
3. 打包圖片
有時候我們的程式會用到圖片,但是pyinstaller打包出來的程式是不包含圖片的,這時候程式就沒辦法正常執行,或者需要帶著幾張圖片才能執行,這對於強迫症來說是不能接受的。
網上找了一下資料,發現有一個解決辦法,可以參考以下兩篇部落格:
裡面的方法我試過了,不知道是我操作出了問題還是什麼,這個方法根本不能用,只是把路徑寫成絕對路徑,在本機能用,到其他電腦就不行了。
這個方法可以用了,但是部落格裡面提供的程式碼會為每一張圖片生成一個 .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')