中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Pyinstaller打包怎么用

發布時間:2021-06-29 09:10:22 來源:億速云 閱讀:279 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關Pyinstaller打包怎么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

一、安裝pyinstaller

PyInstaller是一個用來將Python程序打包成一個獨立可執行文件的第三方包。

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

pip install pyinstaller

或者升級到最新版本:

pip install --upgrade pyinstaller

或者安裝開發者版本:

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

當然了,也可以下載whl文件,然后pip install安裝

更多可參考官網指引:

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

二、打包初體驗

我們簡單試下打包python代碼為exe可執行文件,測試代碼如下:

# 測試.py
import os

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

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

pyinstaller -F 測試.py

這個命令,執行過程如下:

(env_test) F:\PythonCool\pyinstaller>pyinstaller -F 測試.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\測試.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\測試.exe
18999 INFO: Building EXE from EXE-00.toc completed successfully.

成功后會在同級目錄下生成一個dist文件,里面就是一個和代碼文件名同名的可執行文件:

Pyinstaller打包怎么用

雙擊該可執行文件,我們可以看到直接在python解釋器里運行測試.py文件時一樣的結果:

Pyinstaller打包怎么用

這里需要注意的是,我們在進行打包的時候,有必要指定被打包的py文件的路徑,兩種方式供選擇:

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

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

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

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

關于成功打包的測試.exe可執行文件,我們發現其圖標是默認的,且啟動時會顯示命令行窗口。那么,我們可以怎么自定義exe圖標,又或者去掉命令行窗口呢?

三、打包進階體驗

好了,接下來,我們先看看關于pyinstaller打包時候的一些別的參數都有哪些,如何自定義exe圖標以及如何去掉命令行窗口等等。

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

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

參數說明
-F產生單個的可執行文件
-D產生一個目錄(包含多個文件)作為可執行程序
-a不包含 Unicode 字符集支持
-ddebug 版本的可執行文件
-w指定程序運行時不顯示命令行窗口(僅對 Windows 有效)
-c指定使用命令行窗口運行程序(僅對 Windows 有效)
-o指定 spec 文件的生成目錄。如果沒有指定,則默認使用當前目錄來生成 spec 文件
-p設置 Python 導入模塊的路徑(和設置 PYTHONPATH 環境變量的作用相似)。也可使用路徑分隔符(Windows 使用分號,Linux 使用冒號)來分隔多個路徑
-n指定項目(產生的 spec)名字。如果省略該選項,那么第一個腳本的主文件名將作為 spec 的名字

打包一個帶自定義icon的exe可執行文件

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

https://www.iconfont.cn/

可以去這里將圖片轉化為icon文件:

https://www.bitbug.net/

然后,用一下命令可以自定義exe圖標:

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

成功后,我們可以看到圖標變成了我們自定義的這個:

Pyinstaller打包怎么用

打包去掉命令行彈窗的exe可執行文件

如果我們是有GUI的程序,想在啟動的時候去掉命令行窗口,那么可以用以下指令進行打包,這里以tkinter內置GUI庫為例展示:

# 測試.py
import tkinter

top = tkinter.Tk()
# 進入消息循環
top.mainloop()

以上測試代碼,如果用初體驗中的方式,在GUI界面出現的同時也會出現命令行彈窗,我們想去掉命令行彈窗可以:

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

雙擊打包后的exe文件,可以看到只會出現GUI界面,命令行窗口并沒有出現。

Pyinstaller打包怎么用

四、帶配置文件打包

所謂帶配置文件打包,這里是指打包的時候除了py文件、依賴的庫之外,還存在需要引用的其他資源文件。直接用以上方式打包的時候,這些資源是無法被打進包的,我們需要進行修改打包時的spec文件來實現。

spec文件是告訴Pyinstaller怎么打包py文件,比如路徑、資源、動態庫、隱式調用的模塊等等。一般來說,我們不需要對它進行修改…

這里我用此前《詞云繪制小工具》的案例來進行介紹。

我們直接用打包進階體驗中的命令可以進行成功打包,不過這里我們發現有兩個問題:①包體很大,比此前案例里大了10倍左右;②啟動exe文件的時候報錯了。

Pyinstaller打包怎么用

關于包體較大的情況,可以試著創建虛擬環境,然后只安裝程序里需要調用的庫即可,這里只簡單介紹:

# 創建虛擬環境
conda create -n your_env_name python=3.8.10
# 啟動虛擬環境
activate your_env_name

關于啟動報錯的情況,由于比較復雜,我們一步一步來看:

①由于無命令行彈窗,無法查看到具體的報錯,這里先去帶命令行窗口形式看下報錯信息,我們看報錯如下:

Pyinstaller打包怎么用

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

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

block_cipher = None

a = Analysis(['詞云繪制工具.py'],
             pathex=['F:\\PythonCool\\pyinstaller'],
             binaries=[],
             datas=[], # 這里帶上資源文件地址
             hiddenimports=[], # 動態引入的庫或模塊
             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')

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

Pyinstaller打包怎么用

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

前者是資源文件在本機的位置,后者為打包后文件調用的相對路徑,編輯好spec文件后,通過以下命令進行打包:

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

Pyinstaller打包怎么用

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

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

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')]

我們將配置資源打進包后可以正常啟動exe可執行文件了。

Pyinstaller打包怎么用

但是,又發現在執行詞云繪制的時候,也會出現報錯。不過看報錯的情況是提示不存在xx模塊,那么這是什么情況呢?!

五、添加隱式調用庫

我們找到報錯的地方代碼如下,采用了__import__()函數用于動態加載類和函數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

對于這個問題,我試過兩種方案,大家可以參考一下。

方案一:在spec文件中hiddenimports中添加動態引用的模塊

hiddenimports=['palettable'], # 動態引入的庫或模塊

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

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

方案二:修改stylecloud庫中調用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,
    # )

通過第4和5部分,我們用pyinstaller終于成功打包且正常運行使用了。

Pyinstaller打包怎么用

關于“Pyinstaller打包怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

青海省| 克拉玛依市| 铁力市| 长白| 虞城县| 来凤县| 邛崃市| 新源县| 资中县| 肇源县| 庄浪县| 辽宁省| 蓝田县| 乳源| 房产| 黄浦区| 精河县| 喀喇| 金昌市| 慈溪市| 邳州市| 宜宾市| 大竹县| 眉山市| 玉环县| 平山县| 横山县| 慈利县| 高碑店市| 盘锦市| 五河县| 融水| 宁化县| 嘉义县| 漳州市| 昂仁县| 全椒县| 石泉县| 南开区| 旌德县| 黄冈市|