pyinstaller打包pyqt文件

https://www.cnblogs.com/dcb3688/p/4211390.html

打包pyqt文件

如何将pyqt生成exe的二进制文件呢,pyinstaller就是这样的工具

可以将脚本文件.py 文件转换为编辑后的二进制文件,在进行发布

下面说下,如果打包

一. 安装:

下载地址:https://github.com/pyinstaller/pyinstaller

最新版本pyinstaller2.1.1 (2015-01)

1
python setup.py install

  pyinstaller 是有依赖包的,安装之前必须要安装pywin32, 在网上找到对应版本的pywin32.msi

二. 写一个要打包的py文件

# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui, QtCoreclass buttonRedrect(QtGui.QWidget):def __init__(self):super(buttonRedrect, self).__init__()self.setWindowTitle('Mouse Event')self.setWindowIcon(QtGui.QIcon('QQ.png'))self.labels = QtGui.QLabel(u'点我试试!', self)self.labels.setGeometry(50, 50, 150, 50)self.labels.mouseReleaseEvent = self.eventsdef events(self, event):ev=event.button()if ev== QtCore.Qt.LeftButton:OK = QtGui.QMessageBox.information(self, (u'提示'),(u'左键'),QtGui.QMessageBox.Yes , QtGui.QMessageBox.No)if OK==QtGui.QMessageBox.Yes:QtGui.QMessageBox.information(self, (u'提示'),(u'YES'),QtGui.QMessageBox.Yes)else:QtGui.QMessageBox.information(self, (u'提示'),(u'NO'),QtGui.QMessageBox.Yes)elif ev == QtCore.Qt.RightButton:OK = QtGui.QMessageBox.warning(self, (u'提示'),(u'右键'),QtGui.QMessageBox.Yes , QtGui.QMessageBox.No)elif ev == QtCore.Qt.MiddleButton:OK = QtGui.QMessageBox.question(self, (u'提示'),(u'滚动轴'),QtGui.QMessageBox.Yes , QtGui.QMessageBox.No)app=QtGui.QApplication(sys.argv)
buttonr=buttonRedrect()
buttonr.show()
sys.exit(app.exec_())

三. 文件打包

在要打包的同级目录下,新建一个pyinstaller.py, 内容如下

#! /usr/bin/env python
#-----------------------------------------------------------------------------
# Copyright (c) 2013, PyInstaller Development Team.
#
# Distributed under the terms of the GNU General Public License with exception
# for distributing bootloader.
#
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------
"""
Main command-line interface to PyInstaller.
"""
# from  PyInstaller import  *
import  osif __name__ == '__main__':from PyInstaller.main import runopts=['abc.py','-F','-w','--icon=favicon.ico']run(opts)

其中opts是参数,将参数修改成你要的需求

-- 参数说明:

-F, --onefile Py代码只有一个文件

-D, --onedir Py代码放在一个目录中(默认是这个)

-K, --tk 包含TCL/TK

-d, --debug 生成debug模式的exe文件

-w, --windowed, --noconsole 窗体exe文件(Windows Only)

-c, --nowindowed, --console 控制台exe文件(Windows Only)

-o DIR, --out=DIR 设置spec文件输出的目录,默认在PyInstaller同目录

--icon=<FILE.ICO> 加入图标(Windows Only)

-v FILE, --version=FILE 加入版本信息文件

--upx-dir, 压缩可执行程序

将命令行CMD切换切换到当前要打包的目录

F:\project\pyqt\TEST>

输入命令:

python pyinstaller.py

等5,6秒pyinstaller的INFO编译完成之后,目录里面就多出两个文件夹 build   和  dist, 其中 dist 里面就是二进制的打包文件

--遇到的问题:

在给打包文件添加icon的时候,报错

  File "C:\Python27\lib\site-packages\pyinstaller-2.1.1dev_-py2.7.egg\PyInstaller\build.py", line 320, in __postinit__self.assemble()File "C:\Python27\lib\site-packages\pyinstaller-2.1.1dev_-py2.7.egg\PyInstaller\build.py", line 1245, in assembleicon.CopyIcons(tmpnm, self.icon)File "C:\Python27\lib\site-packages\pyinstaller-2.1.1dev_-py2.7.egg\PyInstaller\utils\icon.py", line 170, in CopyIconshsrc = win32api.LoadLibraryEx(srcpath, 0, LOAD_LIBRARY_AS_DATAFILE)
pywintypes.error: (193, 'LoadLibraryEx', '%1 \xb2\xbb\xca\xc7\xd3\xd0\xd0\xa7\xb5\xc4 Win32 \xd3\xa6\xd3\xc3\xb3\xcc\xd0\xf2\xa1\xa3')

当时我选择的icon参数是: --icon=favicon.png

后来把icon格式改为favicon.ico,才可以, 且 icon的参数不能带  " ' "  or  '  "   '


pyinstaller Using UPX

UPX的作用是给生成的exe加壳,减小体积,  我测试打包一个pyqt14Mb文件UPX压缩后只有9Mb

下载upx

地址:http://upx.sourceforge.net/    (最新upx391w.zip,2013-05月)

官网说明

http://pythonhosted.org/PyInstaller/#using-upx

Using UPX

UPX is a free utility available for most operating systems. UPX compresses executable files and libraries, making them smaller, sometimes much smaller. UPX is available for most operating systems and can compress a large number of executable file formats. See the UPX home page for downloads, and for the list of supported executable formats. As of May 2013, the only major absence is 64-bit binaries for Windows and Mac OS X. UPX has no effect on these.

A compressed executable program is wrapped in UPX startup code that dynamically decompresses the program when the program is launched. After it has been decompressed, the program runs normally. In the case of a PyInstaller one-file executable that has been UPX-compressed, the full execution sequence is:

  • The compressed program start up in the UPX decompressor code.
  • After decompression, the program executes the PyInstaller bootloader, which creates a temporary environment for Python.
  • The Python interpreter executes your script.

PyInstaller looks for UPX on the execution path or the path specified with the --upx-dir option. If UPX exists, PyInstaller applies it to the final executable, unless the --noupx option was given. UPX has been used with PyInstaller output often, usually with no problems.

使用

将下载的UPX包解压,将upx.exe 复制到pyinstaller的根目录 或项目目录,在pyinstaller参数中添加--upx-dir=FILE

注意:

  • 网上教程常见的-X选项启用upx已经失效
  • 如果upx.exe已经复制到PyInstaller文件夹下,会默认使用upx,如果不在文件夹下,可以使用--upx-dir选项,如--upx-dir=upx_dir,如--upx-dir=/usr/local/share/   or --upx-dir=./
  • 如果upx.exe复制到了PyInstaller文件夹下,如果不想使用upx,需要添加参数 --noupx

upx打包报错:

upx: C:\Users\Administrator\AppData\Roaming\pyinstaller\bincache01_py27\mfcm90u.dll: CantPackException: .NET files (win32/.net) are not yet supported
34447 INFO: Executing - ./upx --lzma -q C:\Users\Administrator\AppData\Roaming\pyinstaller\bincache01_py27\qtgui4.dll
39400 INFO: Executing - ./upx --lzma -q C:\Users\Administrator\AppData\Roaming\pyinstaller\bincache01_py27\qtsvg4.dll
39618 INFO: Executing - ./upx --lzma -q C:\Users\Administrator\AppData\Roaming\pyinstaller\bincache01_py27\qtxml4.dll
39877 INFO: Executing - ./upx --lzma -q C:\Users\Administrator\AppData\Roaming\pyinstaller\bincache01_py27\qtopengl4.dll
upx: C:\Users\Administrator\AppData\Roaming\pyinstaller\bincache01_py27\qtopengl4.dll: IOException: rename error: File exists
Cannot find ('qtopengl4.dll', 'C:\Users\Administrator\AppData\Roaming\pyinstaller\bincache01_py27\qtopengl4.dll', 1, 'b')
Traceback (most recent call last):

意思就是没有找到qtopeng14.dll,

解决办法: 复制Python安装目录C:\Python27\Lib\site-packages\PyQt4 下的QtOpenGL4.dll到C:\Users\Administrator\AppData\Roaming\pyinstaller\bincache01_py27


--version添加版权信息

我们发现一般打包的二进制exe文件都有版权信息,如QQ

那pyinstaller如何添加版权信息呢?

添加版权信息很简单,添加参数:

-v FILE, --version=FILE 加入版本信息文件

官网说明:

地址:  http://pythonhosted.org/PyInstaller/#capturing-version-data

Capturing Version Data

pyi-grab_version executable_with_version_resource

The pyi-grab_version command is invoked with the full path name of a Windows executable that has a Version resource. (A Version resource contains a group of data structures, some containing binary integers and some containing strings, that describe the properties of the executable. For details see the Version Information Structures page.)

The command writes text that represents a Version resource in readable form. The version text is written to standard output. You can copy it from the console window or redirect it to a file. Then you can edit the version information to adapt it to your program. This approach is used because version resources are complex. Some elements are optional, others required. When you view the version tab of a Properties dialog, there's no simple relationship between the data displayed and the structure of the resource. Using pyi-grab_version you can find an executable that displays the kind of information you want, copy its resource data, and modify it to suit your package.

The version text file is encoded UTF-8 and may contain non-ASCII characters. (Unicode characters are allowed in Version resource string fields.) Be sure to edit and save the text file in UTF-8 unless you are certain it contains only ASCII string values.

The edited version text file can be given with a --version-file= option to pyinstaller or pyi-makespec. The text data is converted to a Version resource and installed in the executable output.

In a Version resource there are two 64-bit binary values, FileVersion and ProductVersion. In the version text file these are given as four-element tuples, for example:

filevers=(2, 0, 4, 0),
prodvers=(2, 0, 4, 0),

The elements of each tuple represent 16-bit values from most-significant to least-significant. For example the FileVersion value given resolves to 0002000000040000 in hex.

set_version version_text_file executable_file

The set_version utility reads a version text file as written by pyi-grab_version, converts it to a Version resource, and installs that resource in the executable_file specified.

For advanced uses, examine a version text file. You find it is Python code that creates a VSVersionInfo object. The class definition for VSVersionInfo is found in utils/versioninfo.py in the PyInstallerdistribution folder. You can write a program that imports that module. In that program you can eval the contents of a version info text file to produce a VSVersionInfo object. You can use the .toRaw()method of that object to produce a Version resource in binary form. Or you can apply the unicode() function to the object to reproduce the version text file.

使用pyinstaller内置的grab_version.py工具获得其他.exe程序的版本信息文件,版本信息文件里面包括公司名、程序名称版本号、文件说明、语言等

然后再把这个信息里面的相关信息更改成你想要的信息,再使用上面的--version-file=version_text_file

使用

grab_version.py的位置:   Python安装目录\Lib\site-packages\PyInstaller-2.1.1dev_-py2.7.egg\PyInstaller\cliutils\grab_version.py

同时你也可以在Python安装目录找到C:\Python27\Scripts\pyi-grab_version.exe (前提已经安装pyinstaller) 直接使用pyi-grab_version.exe

python grab_version.py  C:\QQProtect.exe

pyi-grab_version.exe   C:\QQProtect.exe

产生的file_version_info.txt内容如下:

# UTF-8
#
# For more details about fixed file info 'ffi' see:
# http://msdn.microsoft.com/en-us/library/ms646997.aspx
VSVersionInfo(ffi=FixedFileInfo(# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)# Set not needed items to zero 0.filevers=(3, 9, 3, 7012),prodvers=(3, 9, 3, 0),# Contains a bitmask that specifies the valid bits 'flags'rmask=0x3f,# Contains a bitmask that specifies the Boolean attributes of the file.flags=0x0,# The operating system for which this file was designed.# 0x4 - NT and there is no need to change it.OS=0x4,# The general type of file.# 0x1 - the file is an application.fileType=0x1,# The function of the file.# 0x0 - the function is not defined for this fileTypesubtype=0x0,# Creation date and time stamp.date=(0, 0)),kids=[StringFileInfo([StringTable(u'040904e4',[StringStruct(u'CompanyName', u'Tencent'),StringStruct(u'FileDescription', u'QQ安全防护进程'),StringStruct(u'FileVersion', u'3.9.3.7012'),StringStruct(u'InternalName', u'QQProtect '),StringStruct(u'LegalCopyright', u'Copyright (C) 1999-2014 Tencent All Rights Reserved'),StringStruct(u'OriginalFilename', u'QQProtect.exe'),StringStruct(u'ProductName', u'腾讯QQ'),StringStruct(u'ProductVersion', u'3.9.3.0')])]), VarFileInfo([VarStruct(u'Translation', [1033, 1252])])]
)

我们修改上面txt文件内容信息保存到项目中的根目录

修改后:

# UTF-8
#
# For more details about fixed file info 'ffi' see:
# http://msdn.microsoft.com/en-us/library/ms646997.aspx
VSVersionInfo(ffi=FixedFileInfo(# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)# Set not needed items to zero 0.filevers=(3, 9, 3, 7012),prodvers=(3, 9, 3, 0),# Contains a bitmask that specifies the valid bits 'flags'rmask=0x3f,# Contains a bitmask that specifies the Boolean attributes of the file.flags=0x0,# The operating system for which this file was designed.# 0x4 - NT and there is no need to change it.OS=0x4,# The general type of file.# 0x1 - the file is an application.fileType=0x1,# The function of the file.# 0x0 - the function is not defined for this fileTypesubtype=0x0,# Creation date and time stamp.date=(0, 0)),kids=[StringFileInfo([StringTable(u'040904e4',[StringStruct(u'CompanyName', u'Pyqt公司'),StringStruct(u'FileDescription', u'Pyqt版本信息测试'),StringStruct(u'FileVersion', u'1.0.0.12'),StringStruct(u'InternalName', u'www.pyqt.com '),StringStruct(u'LegalCopyright', u'Copyright (C) 1999-2015 pyqt All Rights Reserved'),StringStruct(u'OriginalFilename', u'getversion.exe'),StringStruct(u'ProductName', u'Pyqt版本信息显示效果'),StringStruct(u'ProductVersion', u'1.9.3.0')])]), VarFileInfo([VarStruct(u'Translation', [1033, 1252])])]
)

pyinstaller命令:

if __name__ == '__main__':from PyInstaller.main import runparams=['Getversion.py', '-F', '-w', '--icon=favicon.ico', '--version-file=file_version_info.txt']run(params)

效果:

好文要顶 关注我 收藏该文  

转载于:https://www.cnblogs.com/it-tsz/p/10586737.html

pyinstaller打包pyqt文件(转)相关推荐

  1. pyinstaller打包py文件生成的exe出现闪退问题

    在使用pyinstaller打包py文件生成可执行文件exe出现闪退问题,解决方法: 在需要打包的py文件中的主函数最后一行添加如下代码: python2: raw_input('please inp ...

  2. python打包exe黑框一闪而过,解决pyinstaller打包exe文件出现命令窗口一闪而过的问题...

    用pyinstaller打包的exe文件打开时,命令窗口一闪而过,并且未出现GUI界面,也看不到错误信息,然后去网上搜相关的信息,最多的两种说法: 1.添加raw_input()或者os.system ...

  3. PyInstaller 打包单文件 exe 注意事项

    PyInstaller 打包单文件 exe 注意事项 PyInstaller 打包单文件 exe 注意事项 0. 官网 1. PyInstaller 打包单文件 exe 时遇到的问题 2. 找不到 P ...

  4. python pyinstaller 打包exe文件,(附带图片 + 自己、别人电脑上均可以运行)

    python pyinstaller 打包exe文件,(附带图片 + 自己.别人电脑上均可以运行) 科目:windows + python pyinstaller 打包exe 内容:打包程序.图片.视 ...

  5. Py打包应用程序(zipapp打包.pyz文件、pyinstaller打包exe文件)

    ''' Py打包应用程序.py (zipapp打包.pyz文件.pyinstaller打包exe文件)注意: 一.zipapp模块 打包档案包 的 命令行语法: python -m zipapp so ...

  6. Pyinstaller打包python文件太大?教你三个小技巧有效减小文件体积

    简介 有时候需要在未安装Python环境的平台上运行py程序,使用pyinstaller打包很方便,但打包后的可执行文件实在是太大了.原因在于打包时pyinstaller本就已经关联了很多的pytho ...

  7. 解决pyinstaller打包exe文件过大(菜鸟一刀切傻办法)

    pyinstaller打包exe文件过大 作为认真学习了Python两个多月的小白,觉得python还是有很多玄学,一直搞不懂明明一毛一样的步骤,为什么我用pyinstaller打包出来的exe有30 ...

  8. 用Pyinstaller打包.py文件

    用Pyinstaller打包.py文件 一.完成.py文件 二.下载安装pyinstaller 1.打开cmd 2.下载pyinstaller 3.检查是否安装成功 三.开始打包 1.进入.py文件的 ...

  9. pyinstaller打包exe文件太大解决方法

    pyinstaller打包exe文件太大的原因是把其它用不到的库也一起打包了,我的python用的Anoconda,本身带了很多库,代码打包后文件330MB,解决后只有29MB. 一.解决方法 解决方 ...

最新文章

  1. git 常用命令 方法大全
  2. java https 慢_jetty https慢怎么调优?
  3. Jenkins安装目录说明
  4. 7-69 字母图形 (15 分)
  5. C#~异步编程续~.net4.5主推的awaitasync应用
  6. Linux 终端环境安装 L2TP 客户端
  7. Android中的Handler, Looper, MessageQueue和Thread
  8. 三张图搞懂JavaScript的原型对象与原型链
  9. 我在创业公司的开发经验总结
  10. VS中为非控制台程序提供控制台输出窗口
  11. Windows NT/2k/XP/Vista 管理员密码重置
  12. VASP、Lammps快速上手神器——MedeA软件
  13. 显卡驱动设备状态代码31
  14. Django Django文档
  15. 2021年WordPress博客装修美化(一)
  16. WebApi编程(一)-DOM
  17. 【优化】COUNT(1)、COUNT(*)、COUNT(常量)、COUNT(主键)、COUNT(ROWID)、COUNT(非空列)、COUNT(允许为空列)、COUNT(DISTINCT 列名)
  18. Spring Integration Kafka
  19. 最新最全 Android 常用开源库总结
  20. 现代密码学(Introduction to Modern Cryptography)

热门文章

  1. 【内网安全】域横向网络传输应用层隧道技术
  2. Jackson ObjectMapper
  3. 原子操作的实现原理(锁和循环CAS)
  4. C语言再学习 -- ctype.h字符判断函数
  5. 汇编语言LAHF和SAHF指令
  6. 新浪是如何分析处理32亿条实时日志的?
  7. c++ 代码_C代码对汇编代码中声明的全局符号的访问方式详解
  8. JZOJ 5609. 【NOI2018模拟3.28】Tree BZOJ 4919: [Lydsy1706月赛]大根堆
  9. python获取当前时间代码_python当前时间格式化代码
  10. 瞬时极性法对正负反馈的判断方法_直流电焊机正负极判断方法