一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - 使用pyinstaller打包python PyQt5程序

使用pyinstaller打包python PyQt5程序

2022-01-19 00:13wdc Python

當(dāng)你寫好一個python應(yīng)用以后(有可能是命令行,有可能是GUI),你或許希望分享給他人使用,而別人可能并沒有python環(huán)境,那么我們需要尋找一種方法生成可執(zhí)行文件(比如Windows上的exe或macOs上的app)

當(dāng)你有打包你的python應(yīng)用的需求以后,你可能會像搜索引擎尋求幫助,你或許曾經(jīng)搜索過“python 轉(zhuǎn) exe”,“python打包”等等這樣的字眼,你或許曾看到過各種各樣的相關(guān)解決方案,本文介紹的是其中的一種,但是可以負(fù)責(zé)任的說,這是目前最好的方案,并且是跨平臺最好的方案,也就是說使用這個叫pyinstaller的工具,你可以把同樣的代碼打包在Windows,Linux以及macOs上運(yùn)行。

這個工具的名稱就是pyinstaller,官方主頁:
http://www.pyinstaller.org/

這個工具將打包工作封裝成一條簡單的指令就能完成的動作。

準(zhǔn)備

工具準(zhǔn)備

第一件事情當(dāng)然是安裝這個庫了,和往常一樣,使用pip

?
1
pip install pyinstaller

源代碼準(zhǔn)備

因?yàn)槲覀兪轻槍σ粋€GUI應(yīng)用來打包,那么我們需要簡單的改造一下源代碼,如果你是在打包命令行,則不需要進(jìn)行這個操作。

首先,我們要創(chuàng)建一個入口文件,名稱為 wifidrop.pyw,名字無所謂,它將成為你最終的軟件名稱,這里需要注意的是,我們的文件后綴為pyw,比py文件后綴多了一個w,而w的意思是window,也就是說告訴python環(huán)境,我們這個軟件是一個窗口應(yīng)用,如果不這么做,在運(yùn)行軟件的時候,除了有我們的GUI界面以外,python還會留 一個命令行窗口在后邊,這顯然不是我們想要的,而使用了pyw后綴以后,python則不會顯示命令行窗口。

在 wifidrop.pyw 不需要做什么太多東西,僅僅是簡單的調(diào)用main.py中的main函數(shù)就可以了。

?
1
2
3
4
5
6
import sys
from main import main
 
if __name__ == '__main__':
    excode = main()
    sys.exit(excode)

打包

做好代碼相關(guān)的準(zhǔn)備以后,就可以使用pyinstaller來打包軟件了,過程也非常簡單,一行命令就能解決,在命令行中運(yùn)行

?
1
pyinstaller --clean -F -w wifidrop.pyw -i Treetog-I-Documents.ico

參數(shù)說明

–clean :告訴pyinstaller刪除緩存和臨時文件
-F :告訴pyinstaller將打包的結(jié)果放在一個exe文件中,也就是說最終結(jié)果將只有一個exe文件,如果不使用這個參數(shù),那么結(jié)果會是一個exe加很多依賴文件,不利于我們分發(fā)軟件。
-w :告訴pyinstaller我們要生成的是一個窗口應(yīng)用
-i :為我們的應(yīng)用指定一個圖標(biāo),否則默認(rèn)的話會使用python圖標(biāo)
一般來說,這些參數(shù)就足夠日常使用了,如果需要更深入的功能,比如加密等等,就需要閱讀手冊了。

這條命令成功運(yùn)行完以后,你將會在項(xiàng)目目錄中看到build和dist兩個文件夾,最終的可執(zhí)行文件就放置在dist文件家中。

針對PyQt應(yīng)用的改進(jìn)

目前的小問題

當(dāng)我們嘗試運(yùn)行在dist中生成的wifidrop.exe文件的時候,你將發(fā)現(xiàn),程序無法運(yùn)行,不知道你還有沒有印象,至今為止,我們都一直在main.py中使用loadUi函數(shù)加載Qt Creator創(chuàng)建的ui的方式來創(chuàng)建GUI界面,那么仔細(xì)觀察一下dist文件夾中,里邊并沒有ui文件,對吧?

因?yàn)閜yinstaller僅僅是一個py應(yīng)用的打包工具,它并不知道其他的文件的存在,所以,你可以嘗試把我們的兩個ui文件拷貝到dist文件夾中之后再運(yùn)行這個exe。

使用pyinstaller打包python PyQt5程序

你會發(fā)現(xiàn)現(xiàn)在應(yīng)用可以正常使用了。但是這樣會不會有什么風(fēng)險(xiǎn)?

對了,ui文件說白了是一個xml格式的文本文件,如果使用我們軟件的人有意或者無意的修改了這兩個文件中的內(nèi)容,我們的軟件極有可能就沒辦法運(yùn)行了,因此,在分發(fā)我們的軟件的時候,要避免使用ui文件。

ui文件的好處是在開發(fā)的時候,可以迅速的通過Qt Creator修改UI。

解決辦法

當(dāng)然PyQt也提供了很好的解決辦法,它提供了一個小腳本,可以幫我們把ui文件轉(zhuǎn)成py文件,并將UI轉(zhuǎn)換成類。我們通過運(yùn)行下邊這兩條命令,將mainwindow和dialog轉(zhuǎn)成python類。

?
1
2
python -m PyQt5.uic.pyuic -x dialog.ui -o dialog.py
python -m PyQt5.uic.pyuic -x mainwindow.ui -o mainwindow.py

每一個ui文件會對應(yīng)一個py文件,而py文件中會有相應(yīng)的類。

有了py模塊以后,我們還需要在實(shí)例化ui的地方(也就是main.py)中將加載ui文件的方式改為實(shí)例化python類的方式來加載ui,分別要修改MainWindow和SendDialog的初始化函數(shù),選擇2 option的方式來加載ui

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MainWindow(QMainWindow):
    """Main window"""
    def __init__(self):
        super(MainWindow, self).__init__()
 
        # UI setup - 1 option
        # dynamic load ui for development purpose
        # self.ui = loadUi('./mainwindow.ui', self)
 
        # Use py to setup UI - 2 option
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
 
        self.setStatusBar(None# https://doc.qt.io/qt-5/qmainwindow.html#setStatusBa
?
1
2
3
4
5
6
7
8
9
10
11
class SendDialog(QDialog):
    def __init__(self, url_list, socket_server_thread, device_discover_thread, socket_broadcast):
        super(SendDialog, self).__init__()
 
        # UI setup - 1 option
        # dynamic load ui for development purpose
        # self.ui = loadUi('./dialog.ui', self)
 
        # Use py to setup UI - 2 option
        self.ui = Ui_dialog()
        self.ui.setupUi(self)

再次打包

代碼修正之后,我們來使用上邊相同的pyinstaller命令打包,成功運(yùn)行后,點(diǎn)擊生成的wifidrop.exe,你會發(fā)現(xiàn)在無需ui文件的情況下,軟件也能很好的運(yùn)行了。

代碼倉庫說明

本文中用到的打包命令和ui轉(zhuǎn)py命令,可以在github 倉庫 https://github.com/pythonlibrary/wifidrop 中的 tutorial-6-direct-dist 和 tutorial-6-dist tag下找到,這兩個tag的區(qū)別是:前一個使用了加載ui文件的方式顯示UI,后邊一個修正了這個問題,使用類實(shí)例化的方式顯示UI。

更多關(guān)于使用pyinstaller打包python程序的文章請查看下面的相關(guān)文章

原文鏈接:https://pythonlibrary.net/2020/03/01/pack-python-application-with-pyinstaller/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 好男人资源免费观看 | 人人揉人人爽五月天视频 | 欧美一级专区免费大片 | 恩爱夫妇交换小说 | 俄罗斯激情性孕妇孕交大全 | 国产一区二区免费视频 | 国产精品在线 | 亚洲精品91香蕉综合区 | 亚洲网站在线观看 | 黑人群性xxx | 成年人在线播放视频 | 九九99亚洲精品久久久久 | 精品免费 | 学生小泬无遮挡女HD | 香蕉免费高清完整 | 2021国产麻豆剧传媒剧情最新 | 亚洲免费在线观看视频 | 91精品国产一区 | 欧美一区二区免费 | 精品精品久久宅男的天堂 | 美女视频在线观看视频 | 精品亚洲麻豆1区2区3区 | 日韩毛片免费线上观看 | 暖暖日本高清 | 成人欧美一区二区三区白人 | 久久精品成人免费看 | 日本高清动作片www欧美 | 久久人妻少妇嫩草AV無碼 | 沟厕okn系列在线播放 | 久久99精品国产自在自线 | 亚洲好色网 | 1024免费福利永久观看网站 | 四虎影视在线观看2413 | 亚洲AV久久无码精品九九软件 | 91李宗精品72集在线观看 | 国产一级黄色录像 | 四虎网站最新网址 | 免费aⅴ片 | 精品国产人妻国语 | 日本艳鉧动漫1~6完整版在 | 91欧美国产 |