1. 程式人生 > >將python程序發布為可執行文件

將python程序發布為可執行文件

python PyInstaller

自己寫好的python程序在自己的python環境中運行沒有問題。但是如果要發布給別人使用,那麽對方也需要有python環境。否則就需要將我們的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 的文件,下面會講到,也是可以刪除的。

註意:這樣打包你的程序不能包含其他資源文件。沒有import的文件應該都不會打包進去的,貌似程序本身也沒有辦法判斷要包含哪些資源,總不能一句一句去分析你的源碼吧。
其實這裏手動把你的資源文件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程序發布為可執行文件