欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

總結(jié)Pyinstaller打包的高級(jí)用法

 更新時(shí)間:2021年06月28日 17:04:55   作者:可以叫我才哥  
前段時(shí)間在制作詞云制作小工具的時(shí)候,直接在命令行用pyinstaller -F 工具.py指令打包成功后,啟動(dòng)exe可執(zhí)行文件的時(shí)候各種報(bào)錯(cuò), 今天,我們就分享一下踩坑經(jīng)過(guò),需要的朋友可以參考下

一、安裝pyinstaller

PyInstaller是一個(gè)用來(lái)將Python程序打包成一個(gè)獨(dú)立可執(zhí)行文件的第三方包。

因是第三方包,所以需要安裝一下:

pip install pyinstaller

或者升級(jí)到最新版本:

pip install --upgrade pyinstaller

或者安裝開發(fā)者版本:

pip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz

當(dāng)然了,也可以下載whl文件,然后pip install安裝

更多可參考官網(wǎng)指引:

http://www.pyinstaller.org/downloads.html

二、打包初體驗(yàn)

我們簡(jiǎn)單試下打包python代碼為exe可執(zhí)行文件,測(cè)試代碼如下:

# 測(cè)試.py
import os

path = os.getcwd()
print(f'當(dāng)前文件路徑:{path}')
os.system('pause')

這段代碼是打印文件所在的目錄,我們用pyinstaller簡(jiǎn)單打包的命令如下:

pyinstaller -F 測(cè)試.py

這個(gè)命令,執(zhí)行過(guò)程如下:

(env_test) F:\PythonCool\pyinstaller>pyinstaller -F 測(cè)試.py    
403 INFO: PyInstaller: 4.3
403 INFO: Python: 3.8.10 (conda)
434 INFO: Platform: Windows-10-10.0.19042-SP0
436 INFO: wrote F:\PythonCool\pyinstaller\測(cè)試.spec
455 INFO: UPX is not available.
468 INFO: Extending PYTHONPATH with paths
['F:\\PythonCool\\pyinstaller', 'F:\\PythonCool\\pyinstaller']
501 INFO: checking Analysis
...
...
15006 INFO: Appending archive to EXE F:\PythonCool\pyinstaller\dist\測(cè)試.exe
18999 INFO: Building EXE from EXE-00.toc completed successfully.

成功后會(huì)在同級(jí)目錄下生成一個(gè)dist文件,里面就是一個(gè)和代碼文件名同名的可執(zhí)行文件:

雙擊該可執(zhí)行文件,我們可以看到直接在python解釋器里運(yùn)行測(cè)試.py文件時(shí)一樣的結(jié)果:

這里需要注意的是,我們?cè)谶M(jìn)行打包的時(shí)候,有必要指定被打包的py文件的路徑,兩種方式供選擇:

方式一:先切換到被打包py文件目錄,再執(zhí)行打包指令

(base) C:\Users\Gdc>cd F:\PythonCool\pyinstaller
(base) C:\Users\Gdc>F:
(base) F:\PythonCool\pyinstaller>pyinstaller -F 測(cè)試.py

方式二:打包指令中指定py文件的絕對(duì)路徑

(base) C:\Users\Gdc>pyinstaller -F F:\PythonCool\pyinstaller\測(cè)試.py

關(guān)于成功打包的測(cè)試.exe可執(zhí)行文件,我們發(fā)現(xiàn)其圖標(biāo)是默認(rèn)的,且啟動(dòng)時(shí)會(huì)顯示命令行窗口。那么,我們可以怎么自定義exe圖標(biāo),又或者去掉命令行窗口呢?

三、打包進(jìn)階體驗(yàn)

好了,接下來(lái),我們先看看關(guān)于pyinstaller打包時(shí)候的一些別的參數(shù)都有哪些,如何自定義exe圖標(biāo)以及如何去掉命令行窗口等等。

(env_test) F:\PythonCool\pyinstaller>pyinstaller -h

pyinstaller -h可以查看其參數(shù)說(shuō)明,由于較多這里不做完整展示,摘取部分常用參數(shù)做簡(jiǎn)要介紹:

參數(shù) 說(shuō)明
-F 產(chǎn)生單個(gè)的可執(zhí)行文件
-D 產(chǎn)生一個(gè)目錄(包含多個(gè)文件)作為可執(zhí)行程序
-a 不包含 Unicode 字符集支持
-d debug 版本的可執(zhí)行文件
-w 指定程序運(yùn)行時(shí)不顯示命令行窗口(僅對(duì) Windows 有效)
-c 指定使用命令行窗口運(yùn)行程序(僅對(duì) Windows 有效)
-o 指定 spec 文件的生成目錄。如果沒(méi)有指定,則默認(rèn)使用當(dāng)前目錄來(lái)生成 spec 文件
-p 設(shè)置 Python 導(dǎo)入模塊的路徑(和設(shè)置 PYTHONPATH 環(huán)境變量的作用相似)。也可使用路徑分隔符(Windows 使用分號(hào),Linux 使用冒號(hào))來(lái)分隔多個(gè)路徑
-n 指定項(xiàng)目(產(chǎn)生的 spec)名字。如果省略該選項(xiàng),那么第一個(gè)腳本的主文件名將作為 spec 的名字

打包一個(gè)帶自定義icon的exe可執(zhí)行文件

我們可以去這里下載icon文件:

https://www.iconfont.cn/

可以去這里將圖片轉(zhuǎn)化為icon文件:

https://www.bitbug.net/

然后,用一下命令可以自定義exe圖標(biāo):

(env_test) F:\PythonCool\pyinstaller>pyinstaller -F -i icon.ico 測(cè)試.py 

成功后,我們可以看到圖標(biāo)變成了我們自定義的這個(gè):

打包去掉命令行彈窗的exe可執(zhí)行文件

如果我們是有GUI的程序,想在啟動(dòng)的時(shí)候去掉命令行窗口,那么可以用以下指令進(jìn)行打包,這里以tkinter內(nèi)置GUI庫(kù)為例展示:

# 測(cè)試.py
import tkinter

top = tkinter.Tk()
# 進(jìn)入消息循環(huán)
top.mainloop()

以上測(cè)試代碼,如果用初體驗(yàn)中的方式,在GUI界面出現(xiàn)的同時(shí)也會(huì)出現(xiàn)命令行彈窗,我們想去掉命令行彈窗可以:

(env_test) F:\PythonCool\pyinstaller>pyinstaller -F -w -i icon.ico 測(cè)試.py  

雙擊打包后的exe文件,可以看到只會(huì)出現(xiàn)GUI界面,命令行窗口并沒(méi)有出現(xiàn)。

四、帶配置文件打包

所謂帶配置文件打包,這里是指打包的時(shí)候除了py文件、依賴的庫(kù)之外,還存在需要引用的其他資源文件。直接用以上方式打包的時(shí)候,這些資源是無(wú)法被打進(jìn)包的,我們需要進(jìn)行修改打包時(shí)的spec文件來(lái)實(shí)現(xiàn)。

spec文件是告訴Pyinstaller怎么打包py文件,比如路徑、資源、動(dòng)態(tài)庫(kù)、隱式調(diào)用的模塊等等。一般來(lái)說(shuō),我們不需要對(duì)它進(jìn)行修改…

這里我用此前《詞云繪制小工具》的案例來(lái)進(jìn)行介紹。

我們直接用打包進(jìn)階體驗(yàn)中的命令可以進(jìn)行成功打包,不過(guò)這里我們發(fā)現(xiàn)有兩個(gè)問(wèn)題:①包體很大,比此前案例里大了10倍左右;②啟動(dòng)exe文件的時(shí)候報(bào)錯(cuò)了。

關(guān)于包體較大的情況,可以試著創(chuàng)建虛擬環(huán)境,然后只安裝程序里需要調(diào)用的庫(kù)即可,這里只簡(jiǎn)單介紹:

# 創(chuàng)建虛擬環(huán)境
conda create -n your_env_name python=3.8.10
# 啟動(dòng)虛擬環(huán)境
activate your_env_name

關(guān)于啟動(dòng)報(bào)錯(cuò)的情況,由于比較復(fù)雜,我們一步一步來(lái)看:

①由于無(wú)命令行彈窗,無(wú)法查看到具體的報(bào)錯(cuò),這里先去帶命令行窗口形式看下報(bào)錯(cuò)信息,我們看報(bào)錯(cuò)如下:

提示缺少這個(gè)文件,我們可以在打包生成的詞云繪制工具.spec配置文件里將這個(gè)資源放上

# -*- mode: python ; coding: utf-8 -*-
# 詞云繪制工具.spec

block_cipher = None

a = Analysis(['詞云繪制工具.py'],
             pathex=['F:\\PythonCool\\pyinstaller'],
             binaries=[],
             datas=[], # 這里帶上資源文件地址
             hiddenimports=[], # 動(dòng)態(tài)引入的庫(kù)或模塊
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='詞云繪制工具',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True , icon='icon.ico')

通過(guò)在wordcloud模塊目錄里查到了stopwords文件,我們將其放到data中。

datas=[('C:\\Users\\Gdc\\anaconda3\\envs\\env_test\\Lib\\site-packages\\wordcloud\\stopwords','wordcloud')],

前者是資源文件在本機(jī)的位置,后者為打包后文件調(diào)用的相對(duì)路徑,編輯好spec文件后,通過(guò)以下命令進(jìn)行打包:

(env_test) F:\PythonCool\pyinstaller>pyinstaller -D 詞云繪制工具.spec  

好吧,還有一些文件未被打進(jìn)包,所以又出現(xiàn)同樣的問(wèn)題了。所以,我們是需要把全部的資源文件都加到spec文件里的data中。

我們找到全部的資源文件全部加上吧,然后再執(zhí)行打包命令。

datas=[('C:\\Users\\Gdc\\anaconda3\\envs\\env_test\\Lib\\site-packages\\stylecloud\\static','stylecloud\\static'),
    ('C:\\Users\\Gdc\\anaconda3\\envs\\env_test\\Lib\\site-packages\\wordcloud\\stopwords','wordcloud'),
    ('C:\\Users\\Gdc\\anaconda3\\envs\\env_test\\Lib\\site-packages\\jieba\\analyse\\idf.txt','jieba\\analyse'),
    ('C:\\Users\\Gdc\\anaconda3\\envs\\env_test\\Lib\\site-packages\\jieba\\dict.txt','jieba')]

我們將配置資源打進(jìn)包后可以正常啟動(dòng)exe可執(zhí)行文件了。

但是,又發(fā)現(xiàn)在執(zhí)行詞云繪制的時(shí)候,也會(huì)出現(xiàn)報(bào)錯(cuò)。不過(guò)看報(bào)錯(cuò)的情況是提示不存在xx模塊,那么這是什么情況呢?!

五、添加隱式調(diào)用庫(kù)

我們找到報(bào)錯(cuò)的地方代碼如下,采用了__import__()函數(shù)用于動(dòng)態(tài)加載類和函數(shù)palettable模塊。

def gen_palette(palette: str):
    """Generates the corresponding palette function from `palettable`."""
    palette_split = palette.split(".")
    palette_name = palette_split[-1]

    # https://stackoverflow.com/a/6677505
    palette_func = getattr(
        __import__(
            "palettable.{}".format(".".join(palette_split[:-1])),
            fromlist=[palette_name],
        ),
        palette_name,
    )
    return palette_func

對(duì)于這個(gè)問(wèn)題,我試過(guò)兩種方案,大家可以參考一下。

方案一:在spec文件中hiddenimports中添加動(dòng)態(tài)引用的模塊

hiddenimports=['palettable'], # 動(dòng)態(tài)引入的庫(kù)或模塊

這種情況下,palettable庫(kù)里也有一些配置文件需要添加到spec文件里的data中

('C:\\Users\\Gdc\\anaconda3\\envs\\env_test\\Lib\\site-packages\\palettable\\colorbrewer\\data','palettable\\colorbrewer\\data')

方案二:修改stylecloud庫(kù)中調(diào)用palettable模塊的代碼部分

import palettable
def gen_palette(palette: str):
    palette_func = getattr(palettable.tableau,'BlueRed_6')
    return palette_func
 
    # """Generates the corresponding palette function from `palettable`."""
    # palette_split = palette.split(".")
    # palette_name = palette_split[-1]

    #    https://stackoverflow.com/a/6677505
    # palette_func = getattr(
        # __import__(
            # "palettable.{}".format(".".join(palette_split[:-1])),
            # fromlist=[palette_name],
        # ),
        # palette_name,
    # )

通過(guò)第4和5部分,我們用pyinstaller終于成功打包且正常運(yùn)行使用了。

以上就是本次全部?jī)?nèi)容,大家如果遇到打包時(shí)涉及到配置文件的或者隱式調(diào)用的,可以采用這兩個(gè)2技巧進(jìn)行特殊打包!

不過(guò),關(guān)于pyinstaller打包其實(shí)還有更多操作,大家可以多看看官方文檔了解,主要是命令行參數(shù)spec文件里的配置要點(diǎn)。

到此這篇關(guān)于總結(jié)Pyinstaller打包的高級(jí)用法的文章就介紹到這了,更多相關(guān)Pyinstaller打包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入了解Django View(視圖系統(tǒng))

    深入了解Django View(視圖系統(tǒng))

    這篇文章主要介紹了簡(jiǎn)單了解Django View(視圖系統(tǒng)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 下載糗事百科的內(nèi)容_python版

    下載糗事百科的內(nèi)容_python版

    代碼是沒(méi)問(wèn)題的,可以正常運(yùn)行,但是希望做到以下2方面: 1、多線程下載 2、代碼分離度更高,跟面向?qū)ο?
    2008-12-12
  • Python?arrow?更好的日期時(shí)間模塊

    Python?arrow?更好的日期時(shí)間模塊

    這篇文章主要為大家介紹Python的arrow日期時(shí)間模塊,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • python獲取當(dāng)前文件路徑以及父文件路徑的方法

    python獲取當(dāng)前文件路徑以及父文件路徑的方法

    今天小編就為大家分享一篇python獲取當(dāng)前文件路徑以及父文件路徑的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Python GUI編程之tkinter 關(guān)于 ttkbootstrap 的使用詳解

    Python GUI編程之tkinter 關(guān)于 ttkbootstrap 的使用

    ttkbootstrap 是一個(gè)基于 tkinter 的界面美化庫(kù),使用這個(gè)工具可以開發(fā)出類似前端 bootstrap 風(fēng)格的 tkinter 桌面程序,這篇文章主要介紹了Python GUI編程之tkinter 關(guān)于 ttkbootstrap 的使用詳解,需要的朋友可以參考下
    2022-03-03
  • Python實(shí)現(xiàn)向PPT中插入表格與圖片的方法詳解

    Python實(shí)現(xiàn)向PPT中插入表格與圖片的方法詳解

    這篇文章將帶大家學(xué)習(xí)一下如何在PPT中插入表格與圖片以及在表格中插入內(nèi)容,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-05-05
  • python實(shí)現(xiàn)查找兩個(gè)字符串中相同字符并輸出的方法

    python實(shí)現(xiàn)查找兩個(gè)字符串中相同字符并輸出的方法

    這篇文章主要介紹了python實(shí)現(xiàn)查找兩個(gè)字符串中相同字符并輸出的方法,涉及Python針對(duì)字符串操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Python學(xué)習(xí)入門之區(qū)塊鏈詳解

    Python學(xué)習(xí)入門之區(qū)塊鏈詳解

    區(qū)塊鏈的基礎(chǔ)概念很簡(jiǎn)單:一個(gè)分布式數(shù)據(jù)庫(kù),存儲(chǔ)一個(gè)不斷加長(zhǎng)的 list,list 中包含著許多有序的記錄。下面這篇文章主要給大家介紹了關(guān)于Python學(xué)習(xí)入門之區(qū)塊鏈的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面來(lái)一起看看吧。
    2017-07-07
  • python-for x in range的用法(注意要點(diǎn)、細(xì)節(jié))

    python-for x in range的用法(注意要點(diǎn)、細(xì)節(jié))

    這篇文章主要介紹了python-for x in range的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • Linux添加Python?path方法及修改環(huán)境變量的三種方法

    Linux添加Python?path方法及修改環(huán)境變量的三種方法

    這篇文章主要介紹了Linux添加Python?path方法及修改環(huán)境變量的三種方法,Linux 下設(shè)置環(huán)境變量有三種方法,一種用于當(dāng)前終端,一種用于當(dāng)前用戶,一種用于所有用戶,本文對(duì)每種方法給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07

最新評(píng)論