2022年 11月 9日

python懒人小工具:python打包exe 小工具

 

不知道有没有菜鸟和我一样,经常需要把python打包成exe,但是比较懒,虽然命令行很简单,但是不太喜欢用命令行,嘿嘿,就干脆写个小工具专门用来打包exe,方便自己用。

多写代码,就当练习了。成品如下图。

python懒人小工具:python打包exe 小工具

 

使用效果如下图,输入py源文件的完整地址,点击打包exe按钮,然后就能在源文件目录下的dist里打包成exe了。

python懒人小工具:python打包exe 小工具

 

python懒人小工具:python打包exe 小工具

 

原理很简单,就是利用os.system这个函数来执行cmd命令,用pyinstaller来打包。

完整源代码在文章末尾。

笔记时间


 

Python执行cmd命令行的方法:os.system

  1. import os
  2. os.system("dir")

就能执行dir命令,如果想连续执行多条命令,必须要在同一个子程里写完,比如我们打包exe需要先cd 到源文件目录,再用pyinstaller 打包,必须要把2条命令用&&连接起来

python懒人小工具:python打包exe 小工具

 

如果分成2个命令,如下面的写法,这2个命令是无法连续生效的

  1. os.system("cd C:\aa")
  2. s.system("pyinstaller -F -w 1.py")

 

pyqt5 弹出消息框 QMessageBox

弹出消息框,用QMessageBox,如下代码

  1. from PyQt5.QtWidgets import QMessageBox
  2. QMessageBox.about(mainWindow, "执行结果", "恭喜!成功打包exe")

python 简单处理文件路径 PureWindowsPath

如下图,用pathlib即可,可以轻松地从完整路径类似“C:\Users\11\1.py”,得到我们想要的文件名 “1.py”,得到我们要的目录 “C:\Users\11\”

python懒人小工具:python打包exe 小工具

 

pyqt5打包中文路径的解决方法

这个问题我遇到很多次,因为我的windows用户名是中文,每次打包pyqt5的程序,就会报错,如下图,会提示找不到pyqt5插件,困扰我很长时间,最终在网上找到了解决方案

python懒人小工具:python打包exe 小工具

 

解决方案如下

把中文路径下的pyqt5文件夹,全部复制到一个全英文目录下,比如复制到C:\py\PyQt5,然后Pyintaller命令里加上一个 -p C:\py\PyQt5 ,指定插件目录,即可正确编译成exe!

 

其他的没什么了,这个比较简单,常见的pyqt5 gui,控件绑定函数之类的可以参见我之前的笔记。

完整源码如下

main.py

  1. import Ui_py2exe
  2. import sys
  3. from PyQt5.QtWidgets import QApplication,QMainWindow,QMessageBox
  4. import os
  5. from pathlib import PureWindowsPath
  6. def dabao():
  7. fullpath=ui.lineEdit.text()
  8. f=PureWindowsPath(fullpath)
  9. filedir=fullpath.replace(f.name,"")
  10. if ui.checkBox.isChecked()==True:
  11. second=os.system("cd "+filedir+"&&pyinstaller -F -w "+fullpath)
  12. if second==0 :
  13. QMessageBox.about(mainWindow, "执行结果", "恭喜!成功打包exe")
  14. else:
  15. QMessageBox.about(mainWindow, "执行结果", "未知错误")
  16. else:
  17. second=os.system("cd "+filedir+"&&pyinstaller -F "+fullpath)
  18. if second==0 :
  19. QMessageBox.about(mainWindow, "执行结果", "恭喜,成功打包exe")
  20. else:
  21. QMessageBox.about(mainWindow, "执行结果", "未知错误")
  22. if __name__=="__main__":
  23. app=QApplication(sys.argv)
  24. #创建一个窗口
  25. mainWindow=QMainWindow()
  26. ui=Ui_py2exe.Ui_MainWindow()
  27. ui.setupUi(mainWindow)
  28. ui.pushButton_2.clicked.connect(dabao)
  29. mainWindow.show()
  30. sys.exit(app.exec_())

还有一个qtdesigner生成的ui文件

Ui_py2exe.py

  1. # -*- coding: utf-8 -*-
  2. # Form implementation generated from reading ui file 'c:\Users\谭鸿伟\Documents\pythonworks\10-py2exe\py2exe.ui'
  3. #
  4. # Created by: PyQt5 UI code generator 5.15.2
  5. #
  6. # WARNING: Any manual changes made to this file will be lost when pyuic5 is
  7. # run again. Do not edit this file unless you know what you are doing.
  8. from PyQt5 import QtCore, QtGui, QtWidgets
  9. class Ui_MainWindow(object):
  10. def setupUi(self, MainWindow):
  11. MainWindow.setObjectName("MainWindow")
  12. MainWindow.resize(650, 290)
  13. self.centralwidget = QtWidgets.QWidget(MainWindow)
  14. self.centralwidget.setObjectName("centralwidget")
  15. self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
  16. self.lineEdit.setGeometry(QtCore.QRect(180, 20, 381, 31))
  17. self.lineEdit.setObjectName("lineEdit")
  18. self.label = QtWidgets.QLabel(self.centralwidget)
  19. self.label.setGeometry(QtCore.QRect(70, 30, 101, 16))
  20. self.label.setObjectName("label")
  21. self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
  22. self.checkBox.setGeometry(QtCore.QRect(310, 120, 141, 21))
  23. self.checkBox.setObjectName("checkBox")
  24. self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
  25. self.pushButton_2.setGeometry(QtCore.QRect(230, 160, 271, 31))
  26. self.pushButton_2.setObjectName("pushButton_2")
  27. self.label_2 = QtWidgets.QLabel(self.centralwidget)
  28. self.label_2.setGeometry(QtCore.QRect(80, 80, 81, 16))
  29. self.label_2.setObjectName("label_2")
  30. self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
  31. self.lineEdit_2.setGeometry(QtCore.QRect(180, 70, 381, 31))
  32. self.lineEdit_2.setObjectName("lineEdit_2")
  33. self.label_3 = QtWidgets.QLabel(self.centralwidget)
  34. self.label_3.setGeometry(QtCore.QRect(170, 200, 431, 31))
  35. font = QtGui.QFont()
  36. font.setPointSize(15)
  37. self.label_3.setFont(font)
  38. self.label_3.setObjectName("label_3")
  39. MainWindow.setCentralWidget(self.centralwidget)
  40. self.menubar = QtWidgets.QMenuBar(MainWindow)
  41. self.menubar.setGeometry(QtCore.QRect(0, 0, 650, 23))
  42. self.menubar.setObjectName("menubar")
  43. MainWindow.setMenuBar(self.menubar)
  44. self.statusbar = QtWidgets.QStatusBar(MainWindow)
  45. self.statusbar.setObjectName("statusbar")
  46. MainWindow.setStatusBar(self.statusbar)
  47. self.retranslateUi(MainWindow)
  48. QtCore.QMetaObject.connectSlotsByName(MainWindow)
  49. def retranslateUi(self, MainWindow):
  50. _translate = QtCore.QCoreApplication.translate
  51. MainWindow.setWindowTitle(_translate("MainWindow", "py2exe by 爱在初夏夜"))
  52. self.label.setText(_translate("MainWindow", "Py文件完整路径:"))
  53. self.checkBox.setText(_translate("MainWindow", "隐藏CMD窗口"))
  54. self.pushButton_2.setText(_translate("MainWindow", "包成exe"))
  55. self.label_2.setText(_translate("MainWindow", "文件图标路径:"))
  56. self.label_3.setText(_translate("MainWindow", "exe保存路径为源文件所在文件夹的dist目录里"))