1. 程式人生 > >Pyinstaller 使用+打包圖片方法

Pyinstaller 使用+打包圖片方法

0. 前言

Pyinstaller 可以用來將 python 程式打包成獨立可執行程式,讓 python 程式能在沒有裝python環境的機器上執行。有時候用python寫了一個小程式,但是共享給別人時,別人電腦需要裝python才能執行,這時候pyinstaller就很有用了。

本人所用環境為:Win10 + python3.6

1. 安裝

Pyinstaller 的安裝很簡單,用 pip 安裝就可以:

pip install pyinstaller

安裝完在命令列輸入:

pyinstaller

出現以下畫面表示安裝成功。 1539831178617

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打包出來的程式是不包含圖片的,這時候程式就沒辦法正常執行,或者需要帶著幾張圖片才能執行,這對於強迫症來說是不能接受的。

網上找了一下資料,發現有一個解決辦法,可以參考以下兩篇部落格:

裡面的方法我試過了,不知道是我操作出了問題還是什麼,這個方法根本不能用,只是把路徑寫成絕對路徑,在本機能用,到其他電腦就不行了。

這個方法可以用了,但是部落格裡面提供的程式碼會為每一張圖片生成一個 .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包含的內容如下:

1539846709318

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')