天天看點

python項目打包釋出詳解

PyInstaller打包Python項目詳解

</h1>
        <div class="clear"></div>
        <div class="postBody">
           

PyInstaller打包Python詳解

  • 官網參考

一、PyInstaller簡介

1.PyInstaller可以将Python項目在不同平台上打包為可執行檔案.
2.PyInstaller打包的流程:讀取編寫好的Python項目-->分析其中條用的子產品和庫,并收集其檔案副本(包括Python的解釋器)-->将副本和Python項目檔案(放在一個檔案夾//封裝在一個可執行檔案)中.

二、pyinstaller的參數清單

參數 參數意義

-F

--onefile

1.打包單個檔案,産生一個檔案用于部署(預設),如果代碼都寫在一個.py檔案時使用,項目有多個檔案時不要使用

pyinstaller -F xxx.py

pyinstaller --onefile xxxx.py

-D

--onedir

1.打包多個檔案,産生一個目錄用于部署(預設),用于架構編寫的代碼打包

pyinstaller -D xxx.py(項目入口檔案)

pyinstaller --onedir xxx.py(項目入口檔案)

--key=keys

1.使用keys進行加密打包

pyinstaller --key=1234 -F xx.py

-K

--tk

1.在部署時包含 TCL/TK

-a

--ascii

1.不包含編碼.在支援Unicode的python版本上預設包含所有的編碼

-d

--debug

1.産生debug版本的可執行檔案

-n name

--name=name

1.可選的項目(産生的spec的)名字name

2.第一個腳本的主檔案名将作為spec的名字(預設)

pyinstaller -F -n my_file_name xxx.py

pyinstaller -F --name=my_file_name xxx.py

-o dir

-- out=dir

1.指定spec檔案的生成目錄dir

2.如果沒有指定且目前目錄是PyInstaller的根目錄,會自動建立一個用于輸出(spec和生成的可執行檔案)的目錄

3.如果沒有指定切目前目錄不是PyInstaller的根目錄,則會輸出到目前的目錄下

-p dir

--path=dir

1.用來添加程式所用到的包的所在位置,設定導入路徑(和使用pythonpath效果相似)

2.可以用路徑分割符(Windows使用分号,Linux使用冒号)分割,指定多個目錄.也可以使用多個-p參數來設定多個導入路徑,讓Pyintaller自己去找程式需要的資源

-w

--windowed

--noconsole

1.表示去掉控制台視窗,使用Windows子系統執行,當程式啟動的時候不會打開指令行(隻對Windows有效)

pyinstaller -c xxx.py

pyinstaller xxx.py --noconsole

-c

--nowindowed

--console

1.表示打開控制台視窗,使用控制台子系統執行,當程式啟動的時候會打開指令行(預設)(隻對Windows有效)

pyinstaller -c xxx.py

pyinstaller xxx.py --console

-i

--icon=<file.ioc>

1.将file.ico添加為可執行檔案的資源,改變程式的圖示(隻對Windows系統有效)

pyinstaller -F -i file.ico xxx.py

pyinstall -F --icon=<file.ioc> xxx.py

--icon=<file.exe,n> 1.将file.exe的第n個圖示添加為可執行檔案的資源(隻對Windows系統有效)

-v file

--version=file

1.将verfile作為可執行檔案的版本資源(隻對Windows系統有效)

-s

--strip

1.可執行檔案和共享庫将run through strip.注意Cygwin的strip往往使普通的win32 Dll無法使用

-X

--upx

1.如果有UPX安裝(執行Configure.py時檢測),會壓縮執行檔案(Windows系統中的DLL也會)(參見note)

三、Pyinstaller的使用

  • PyInstaller在Windows/Linux/Mac環境下的使用:執行指令相同,隻需要在不同環境下執行即可

1.pyinstaller的安裝

pip install pyinstaller
           

2.執行指令

  • 2.1打包單個檔案
# 1.執行指令
pyinstaller -F xxx.py
           

# 2.去生成的dist檔案夾找xxx.exe運作

# 3.運作成功,xxx.exe則為可執行檔案,删除其它檔案

  • 2.2打包多個檔案
# 1.執行指令,xxx.py為程式入口檔案
pyinstall -D xxx.py 
           

# 2.删除生成的bulid和dist檔案夾,僅保留xxx.spec檔案

# 3.修改xxx.spec檔案,詳見2.2.1

# 4.執行指令

pyinstaller -F xxx.spec

# 5.去dist檔案夾下找xxx.exe檔案

# 6.運作成功,删除臨時檔案目錄build;dist目錄為打包的結果,可執行檔案和其它程式運作的關聯檔案都在這個目錄下

  • 2.2.1 xxx.spec配置檔案詳解

block_cipher = None

# 以py檔案為輸入,分析py檔案的依賴子產品,并生成相應的資訊

a = Analysis([‘xxx.py’], # 要打包.py檔案名清單,和xxx.py同級可以不同添加

pathex=[‘D:\abc\def\project_v1.0’], # 項目路徑

binaries=[], # 程式調用外部pyd、dll檔案(二進制檔案路徑)以數組形式傳入;例:(‘D:\pro\text.dll’, ‘pro’),将’pdftotext.dll’pro,與原項目結構一緻即可

datas=[], # 存放的資源檔案(圖檔、文本等靜态檔案)以數組形成傳入;例:(‘D:\static\c.ioc’,‘static’),将’cc.ioc’打包之後放在static目錄,與原項目結構一緻即可

hiddenimports=[], # pyinstaller解析子產品時可能會遺漏某些子產品(not visible to the analysis phase),造成打包後執行程式時出現類似No Module named xxx;這時就需要在hiddenimports中加入遺漏的子產品

hookspath=[],

runtime_hooks=[],

excludes=[], # 去除不必要的子產品import,寫在excludes中添加此子產品

win_no_prefer_redirects=False,

win_private_assemblies=False,

cipher=block_cipher)

# .pyz的壓縮包,包含程式運作需要的所有依賴

pyz = PYZ(a.pure, a.zipped_data,

cipher=block_cipher)

# 根據Analysis和PYZ生成單個exe程式所需要的屬性及其配置

exe = EXE(pyz,

a.scripts,

exclude_binaries=True,

name=‘xxx’, # 生成exe檔案的名字

debug=False, # debug模式

strip=False,

upx=True,

console=False, # 是否在打開exe檔案時打開cmd指令框

icon=‘C:\Users\xx.ico’ ) # 設定exe程式圖示,ico格式檔案(16*16)

# 收集前三個部分的内容進行整合,生成程式所需要的依賴包,及資源檔案和配置

coll = COLLECT(exe,

a.binaries,

a.zipfiles,

a.datas,

strip=False,

upx=True,

name=‘fastplot’)

四、踩坑

  • 編輯.spec檔案路徑相關

1.windows盡量使用絕對路徑,用雙斜杠\ \

2.linux路徑/home/my_project/web

3..路徑避免使用中文

  • 打包.spec檔案報錯:RecursionError: maximum recursion depth exceeded

1.在spec檔案上添加遞歸深度的設定

import sys

sys.setrecursionlimit(5000)

  • 更換exe圖示報錯:AttributeError: module 'win32ctypes.pywin32.win32api' has no attribute 'error'

1.圖示的大小建議(64*64): https://lvwenhan.com/convertico/

2.圖示的顔色嚴格限制:256,真彩色是不行的

  • 打包錯誤:ModuleNotFoundError: No module named 'xxxxx'

方法1:pyinstaller -D --hidden-import="xxxxx" main.py

方法2:在xxx.spec中配置hiddenimports=['xxxxx']

  • 運作exe檔案報錯:Failed to excute Script main
1.使用-c模式重新打包調試,找的缺失的子產品,pip install安裝
  • 檔案打包後過大
1.在程式中盡量不使用import xx;而是使用 from xx import xx

分類: Python

<div id="blog_post_info">
           

好文要頂 關注我 收藏該文

python項目打包釋出詳解
python項目打包釋出詳解
python項目打包釋出詳解

丶小白吖

關注 - 9

粉絲 - 0 +加關注 0 0

<div class="clear"></div>
<div id="post_next_prev">

<a href="https://www.cnblogs.com/bbiu/p/11675630.html" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  class="p_n_p_prefix">« </a> 上一篇:    <a href="https://www.cnblogs.com/bbiu/p/11675630.html" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  title="釋出于 2019-10-19 20:05">supervisor安裝/配置</a>
<br>
<a href="https://www.cnblogs.com/bbiu/p/13578549.html" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  class="p_n_p_prefix">» </a> 下一篇:    <a href="https://www.cnblogs.com/bbiu/p/13578549.html" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  title="釋出于 2020-08-28 17:08">Python3内置資料結構</a>
           

posted @ 2020-06-29 18:33  丶小白吖  閱讀( 1127)  評論( 0)  編輯  收藏

</div><!--end: topics 文章、評論容器-->