將python程序發布為可執行文件
PyInstaller
PyInstaller是一個十分有用的第三方庫,它能夠在Windows、Linux、Mac OS X 等操作系統下將 Python 源文件打包,通過對源文件打包, Python 程序可以在沒有安裝 Python 的環境中運行,也可以作為一個獨立文件方便傳遞和管理。
PyInstaller 的官網:http://www.pyinstaller.org/
安裝
使用 pip 命令就可以完成安裝:
pip install pyinstaller
不過可能國外的源被墻了,這裏還可以指定第三方的源來安裝:
pip install -i https://mirrors.163.com/pypi/simple pyinstaller
安裝完成後,會生成一個pyinstaller.exe的文件在你的Scripts文件夾裏,就是pip.exe的那個文件夾。之後就用這個來打包我們的程序。還有一個文件是pyi-makespec.exe也是的。
直接打包程序
使用下面的命令將程序打包:
pyinstaller <主程序名>.py
打完完成後會生成 build 和 dist 兩個文件夾。其中,build 目錄是 pyinstaller 存儲臨時文件的目錄,可以安全刪除。最終的打包程序在 dist 內部的<主程序名>目錄中。另外還有一個 <主程序名>.spec 的文件,下面會講到,也是可以刪除的。
其實這裏手動把你的資源文件copy過去也就OK了,不過這個不是正規路子。
生成規範文件再打包
通過編輯一個規範文件,告知程序需要包含哪些資源文件,通過這個規範文件進行打包。生成默認規範文件的命令:
pyi-makespec <主程序名>.py
其實,之前直接打包的時候,也是先生成默認的規範文件的,然後在根據這個規範文件進行打包。這裏只是把這個過程分成了2步。中間你可以修改這個規範文件,然後再進入下一步的打包。
默認的文件內容如下:
# -*- mode: python -*-
block_cipher = None
a = Analysis([‘showlist.py‘],
pathex=[‘I:\\Python自動化開發學習\\作業\\week1\\多級菜單‘],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name=‘showlist‘,
debug=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name=‘showlist‘)
修改datas這個變量,把你的資源文件添加到後面的列表裏去。下面的例子中,我先定義一個變量added_files,然後將這個列表賦值給datas。列表元素是元組,前面是你的資源的路徑(這裏是相對路徑了),後面是要放到打包文件的哪個位置具體如下:
# -*- mode: python -*-
block_cipher = None
added_files = [
(‘poetry‘, ‘poetry‘),
(‘list.txt‘, ‘.‘),
]
a = Analysis([‘showlist.py‘],
pathex=[‘I:\\Python自動化開發學習\\作業\\week1\\多級菜單‘],
binaries=[],
datas=added_files,
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name=‘showlist‘,
debug=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name=‘showlist‘)
通過規範文件打包,規範文件修改後之後,使用下面的命令指定規範文件進行打包:
pyinstaller <規範文件名>.spec
執行完成後,現在打包好的程序裏就包含了我們添加的資源文件了。其實效果和我們自己時候手動復制是一樣的。
會修改規範文件,就不需要用到下面的參數了。
有用的參數
使用-h可以看到參數的說明,下面是幾個比較有用的參數。
另外使用參數就不需要用使用規範文件了。使用了參數的本質還是先生成一個規範文件,這個規範文件會根據我們的參數有一些變化,然後還是通過規範文件進行打包。可以通過使用參數打包後查看自動生成的規範文件進行比較來驗證。
生成單個文件(-F, --onefile)
命令:
pyinstaller -F <主程序名>.py
或
pyinstaller <主程序名>.py -F
這裏我是試出來直接打包不包含資源文件的程序。成功後dist文件夾下面就只會有一個可執行文件,而且大小也比之前的文件夾小了很多。不過網上說啟動程序會變慢,自己把握把。
如果是包含資源文件的規範文件使用-F參數打包,最後得到的還是一個目錄。
指定資源文件(--add-data 【SRC;DEST or SRC:DEST】)
前面是源,後面對目的,中間是分隔符。windows系統使用分號(;),Linux系統使用冒號(:)。並且這個參數可以多次使用。下面就是添加了2個資源文件:
pyinstaller showlist.py --add-data poetry;poetry --add-data list.txt;.
最後的效果還是和上面使用規範文件再打包一樣,感覺還是用規範文件的方式好一點。這裏可以比較一下系統自動生成的規範文件。
這裏嘗試結合-F一起使用,但是生成的單文件裏測試下來還是沒有包含資源文件。大概就是不能連資源文件一起打包成單一文件的。不過把資源文件復制過去還是可以用的。也就是你的主程序還是單文件的,但是資源文件獨立在外面。
指定圖標(-i 【FILE.ico or FILE.exe,ID or FILE.icns】, --icon 【FILE.ico or FILE.exe,ID or FILE.icns】)
指定個圖標還是蠻有用的,不過試下來,單文件還是貌似無效。只有用文件夾,然後裏面主程序的圖標會變成你指定的圖標。
pyinstaller <主程序名>.py -i <圖標>.ico
同樣的,規範文件裏也是有地方指定圖標的:
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name=‘showlist‘,
debug=False,
strip=False,
upx=True,
console=True , icon=‘name.ico‘)
小結
- 推薦先生成規範文件,然後編輯一下,在通過規範文件來打包
- 還是不要生成單文件了,我試下來也比較雞肋
- 自己用或者和別人交流也不用打包了,幾十k的代碼包下來十幾兆。因為考慮到沒有python環境,應該是把要用到的庫也都包進去了
- 最後打包發布給外行用用還是不錯的,在搞個圖標包裝一下,nice。
展開-wx模塊
有一個wx模塊,是用來做界面的。
做出窗口界面,包裝好我們的python程序,最後再打包成可執行文件來發布。這樣一個python軟件就出來了。
將python程序發布為可執行文件