下午有同學(xué)Python學(xué)習(xí)群里說,使用pyinstaller打包源碼時(shí),因?yàn)榇a中使用了圖像、音頻、視頻等資源文件,無法將程序打包成單一的可執(zhí)行文件。有沒有方法將這些資源文件按保存在代碼中呢?我想了一下,應(yīng)該是可以的。于是乎,花了一個(gè)小時(shí),寫出了下面的代碼,算是拋磚引玉吧。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:申請域名、雅安服務(wù)器托管、營銷軟件、網(wǎng)站建設(shè)、柳北網(wǎng)站維護(hù)、網(wǎng)站推廣。這段代碼可以將二進(jìn)制文件轉(zhuǎn)存為python腳本文件,供其他腳本引用。代碼最后附有使用的例子,演示用的圖片可以隨便照一張。除了轉(zhuǎn)存二進(jìn)制數(shù)據(jù),還提供了兩個(gè)方法:
# -*- coding: utf-8 -*- """以python模塊形式存儲(chǔ)、使用二進(jìn)制文件""" import os import base64 from io import BytesIO def bin2module(bin_file, py_file=None): """二進(jìn)制文件轉(zhuǎn)存為python模塊 bin_file - 二進(jìn)制文件名 py_file - 生成的模塊文件名,默認(rèn)使用二進(jìn)制文件名,僅更改后綴名 """ fpath, fname = os.path.split(bin_file) fn, ext = os.path.splitext(fname) if not py_file: py_file = os.path.join(fpath, '%s.py'%fn) with open(bin_file, 'rb') as fp: content = fp.read() content = base64.b64encode(content) content = content.decode('utf8') with open(py_file, 'w') as fp: fp.write('# -*- coding: utf-8 -*-\n\n') fp.write('import base64\n') fp.write('from io import BytesIO\n\n') fp.write('content = """%s"""\n\n'%content) fp.write('def get_fp():\n') fp.write(' return BytesIO(base64.b64decode(content.encode("utf8")))\n\n') fp.write('def save(file_name):\n') fp.write(' with open(file_name, "wb") as fp:\n') fp.write(' fp.write(base64.b64decode(content.encode("utf8")))\n') if __name__ == '__main__': """測試代碼""" # 將圖像文件轉(zhuǎn)存為img_demo.py bin2module('forever.png', 'demo.py') # 導(dǎo)入剛剛生成的demo模塊 import demo # 用pillow打開圖像,驗(yàn)證demo模塊的get_fp():返回二進(jìn)制的IO對象(類文件對象) from PIL import Image im = Image.open(demo.get_fp()) im.show() # 保存為本地文件,驗(yàn)證demo模塊的save():保存文件 demo.save('demo_save.png')