用pyinstaller打包python程序

1.概述

需求:當(dāng)我們用python寫好一個(gè)單機(jī)版小程序炮温,想發(fā)布在網(wǎng)上或給朋友使用時(shí)袭祟,我們希望能將程序和python環(huán)境一起打包成一個(gè)可執(zhí)行文件雙擊運(yùn)行即可挑社,網(wǎng)友下載后直接運(yùn)行不需要再安裝python環(huán)境和相關(guān)依賴蟹漓。
pyinstaller是一個(gè)能將Python程序轉(zhuǎn)換成單個(gè)可執(zhí)行文件的程序索抓, 操作系統(tǒng)支持Windows, Linux, Mac OS X, Solaris和AIX碳蛋。并且很多包都支持開箱即用胚泌,不依賴環(huán)境。

2.打包

此處我們以win10+python3.5+virtualenv環(huán)境為例演示打包過程
先準(zhǔn)備一個(gè)寫好的python小程序肃弟,我們用Flask結(jié)巴分詞的cut分詞展示在網(wǎng)頁(yè)上源碼下載

在一個(gè)空目錄中創(chuàng)建一個(gè)virtualenv的虛擬環(huán)境玷室,并安裝應(yīng)用的相關(guān)依賴:

D:\workspace\Python\test\test-pyinstaller>virtualenv env
Using base prefix 'c:\\soft\\python\\python3'
New python executable in D:\workspace\Python\test\test-pyinstaller\env\Scripts\python.exe
Installing setuptools, pip, wheel...done.

D:\workspace\Python\test\test-pyinstaller>env\Scripts\activate

(env) D:\workspace\Python\test\test-pyinstaller>pip install Flask
Collecting Flask
  Using cached Flask-0.12.2-py2.py3-none-any.whl
Collecting itsdangerous>=0.21 (from Flask)
Collecting Werkzeug>=0.7 (from Flask)
  Using cached Werkzeug-0.12.2-py2.py3-none-any.whl
Collecting click>=2.0 (from Flask)
  Using cached click-6.7-py2.py3-none-any.whl
Collecting Jinja2>=2.4 (from Flask)
  Using cached Jinja2-2.9.6-py2.py3-none-any.whl
Collecting MarkupSafe>=0.23 (from Jinja2>=2.4->Flask)
Installing collected packages: itsdangerous, Werkzeug, click, MarkupSafe, Jinja2, Flask
Successfully installed Flask-0.12.2 Jinja2-2.9.6 MarkupSafe-1.0 Werkzeug-0.12.2 click-6.7 itsdangerous-0.24

(env) D:\workspace\Python\test\test-pyinstaller>pip install jieba
Collecting jieba
Installing collected packages: jieba
Successfully installed jieba-0.38

(env) D:\workspace\Python\test\test-pyinstaller>

在虛擬環(huán)境中安裝打包需要的依賴:
在windows環(huán)境中會(huì)依賴win32api,所以需要下載pywin32笤受,在此處下載對(duì)應(yīng)python版本的pywin32:https://sourceforge.net/projects/pywin32/files/pywin32/穷缤,下載好后用easy_install安裝;安裝完成后再安裝pyinstaller箩兽,此處從git上安裝最新版本的pyinstaller

(env) D:\workspace\Python\test\test-pyinstaller>easy_install pywin32-221.win-amd64-py3.5.exe
(env) D:\workspace\Python\test\test-pyinstaller>pip install git+https://github.com/pyinstaller/pyinstaller

環(huán)境準(zhǔn)備完畢津肛,我們項(xiàng)目中的目錄結(jié)構(gòu)如下:

image.png

pyinstaller打包命令如下:

pyinstaller [-F] [-w] [-p 模塊] [-i logo.icon] 程序入口文件路徑
參數(shù)說明:
-F 表示生成單個(gè)可執(zhí)行文件
-w 表示去掉控制臺(tái)窗口,這在GUI界面時(shí)非常有用汗贫。不過如果是命令行程序的話那就把這個(gè)選項(xiàng)刪除吧身坐!
-p 表示你自己自定義需要加載的類路徑,一般情況下用不到
-i 表示可執(zhí)行文件的圖標(biāo)

在程序目錄執(zhí)行如下命令進(jìn)行打包:

(env) D:\workspace\Python\test\test-pyinstaller>pyinstaller app.py

打包完成后目錄結(jié)構(gòu)如下:

image.png

在dist目錄中會(huì)包含一個(gè)與可執(zhí)行文件同名的目錄芳绩,目錄里面會(huì)有一個(gè)與可執(zhí)行文件同名的.exe文件掀亥,這個(gè)文件及為可執(zhí)行文件。

image.png

若我們的程序依賴一些靜態(tài)資源我們需要將靜態(tài)資源拷貝到可執(zhí)行文件所在目錄妥色,我們上面的程序需要將模板文件與結(jié)巴分詞的詞典拷貝進(jìn)去搪花。

image.png

然后雙擊app.exe啟動(dòng)flask應(yīng)用,在網(wǎng)頁(yè)訪問查看效果:

image.png

3.踩過的坑

安裝pyinstaller時(shí)直接使用pip install pyinstaller,打包時(shí)會(huì)報(bào)一些錯(cuò)誤撮竿,所以直接安裝git上的最新版

如我們程序中使用了多進(jìn)程multiprocessing吮便,我們需要?jiǎng)?chuàng)建一個(gè)模塊內(nèi)容如下:

# Module multiprocessing is organized differently in Python 3.4+
try:
    # Python 3.4+
    if sys.platform.startswith('win'):
        import multiprocessing.popen_spawn_win32 as forking
    else:
        import multiprocessing.popen_fork as forking
except ImportError:
    import multiprocessing.forking as forking

if sys.platform.startswith('win'):
    # First define a modified version of Popen.
    class _Popen(forking.Popen):
        def __init__(self, *args, **kw):
            if hasattr(sys, 'frozen'):
                # We have to set original _MEIPASS2 value from sys._MEIPASS
                # to get --onefile mode working.
                os.putenv('_MEIPASS2', sys._MEIPASS)
            try:
                super(_Popen, self).__init__(*args, **kw)
            finally:
                if hasattr(sys, 'frozen'):
                    # On some platforms (e.g. AIX) 'os.unsetenv()' is not
                    # available. In those cases we cannot delete the variable
                    # but only set it to the empty string. The bootloader
                    # can handle this case.
                    if hasattr(os, 'unsetenv'):
                        os.unsetenv('_MEIPASS2')
                    else:
                        os.putenv('_MEIPASS2', '')

    # Second override 'Popen' class with our modified version.
    forking.Popen = _Popen

然后在我們的main方法的最前面調(diào)用如下代碼:

import multiprocessing
    multiprocessing.freeze_support()

4.參考

使用PyInstaller打包Python程序
pyinstaller的庫(kù)導(dǎo)入和多進(jìn)程打包問題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市幢踏,隨后出現(xiàn)的幾起案子髓需,更是在濱河造成了極大的恐慌,老刑警劉巖房蝉,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僚匆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡搭幻,警方通過查閱死者的電腦和手機(jī)咧擂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)檀蹋,“玉大人松申,你說我怎么就攤上這事「┯猓” “怎么了贸桶?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)桌肴。 經(jīng)常有香客問我皇筛,道長(zhǎng),這世上最難降的妖魔是什么识脆? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任设联,我火速辦了婚禮,結(jié)果婚禮上灼捂,老公的妹妹穿的比我還像新娘。我一直安慰自己换团,他們只是感情好悉稠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著艘包,像睡著了一般的猛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上想虎,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天卦尊,我揣著相機(jī)與錄音,去河邊找鬼舌厨。 笑死岂却,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播躏哩,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼署浩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了扫尺?” 一聲冷哼從身側(cè)響起筋栋,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎正驻,沒想到半個(gè)月后弊攘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姑曙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年肴颊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渣磷。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡婿着,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出醋界,到底是詐尸還是另有隱情竟宋,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布形纺,位于F島的核電站丘侠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏逐样。R本人自食惡果不足惜蜗字,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脂新。 院中可真熱鬧挪捕,春花似錦、人聲如沸争便。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)滞乙。三九已至奏纪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斩启,已是汗流浹背序调。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兔簇,地道東北人发绢。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓硬耍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親朴摊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子默垄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容