使用Py2exe将PyQt程序打包为exe文件

更多

1.简介

Py2exe可以将一个Python程序打包成exe可执行文件,方便没有Python环境的电脑上使用程序。使用Py2exe打包需要编写一个打包脚本,执行后可以得到打包文件。对于32位版本,Py2exe可以将程序打包成单文件;对于64位版本,暂时还不支持打包成单文件。不过,无论如何压缩,目前Py2exe打包出来的程序都还是偏大的。

2.环境

环境1:
OS:Windows 7 64bits
Python:2.7.2(64bits)
PyQt: 4.9.6

环境2:
OS:Windows 7 32bits/Windows XP 32bits
Python:2.7.2(32bits)
PyQt: 4.9.6

3.软件下载

Py2exe官网上提供的sourceforge的下载地址中,可以下载到2008年11月更新的0.6.9版本,包括针对Python2.3-2.7的32位版本和针对Python2.5-2.7的64位版本。

我们也可以到http://www.lfd.uci.edu/~gohlke/pythonlibs/这个网站下载0.6.10dev版本。顺便说一句,请将此网站保存至书签,这里提供了很多Python插件官方版本中没有支持的64位版本和Python版本的插件编译后的非官方下载。

4.安装

双击exe文件,一路next下去即可。需要注意的是,32位版本和64位版本必须和Python使用的版本配套。

5.使用

在一个PyQt项目中,添加一个文件,其内容为:

sys.argv.append('py2exe')一行,是允许程序通过双击的形式执行。

选项中“includes”是需要包含的文件,这里的”sip”是PyQt程序打包时需要添加的,如果不是PyQt程序不需要此项。

“dll_excludes”是需要排除的dll文件,这里的”MSVCP90.dll”文件,如果不排除的话会报error: MSVCP90.dll: No such file or directory错误。

“compressed”为1,则压缩文件。

“optimize”为优化级别,默认为0。

“ascii”指自动包含encodings和codecs。

“bundle_files”是指将程序打包成单文件(此时除了exe文件外,还会生成一个zip文件。如果不需要zip文件,还需要设置zipfile = None)。1表示pyd和dll文件会被打包到单文件中,且不能从文件系统中加载python模块;值为2表示pyd和dll文件会被打包到单文件中,但是可以从文件系统中加载python模块。64位的Py2exe不要添加本句。

windows = ['pyqtdemo.py',],这里使用的是windows,即没有命令行窗口出现,如果使用console则表示有命令行窗口出现。

执行该文件,会得到一个build文件夹和一个dist文件夹。其中,dist文件夹,就是你得到的打包程序。

如果按照上述代码执行成功,则应该dist文件夹中,只包括程序的exe文件和w9xpopen.exe。w9xpopen.exe是针对windows9x版本的,一般来说该文件并不需要。

如果bundle_files不为1、2,则dist文件夹中还会包括一些dll文件和pyd文件(Python Dll文件)。如果bundle_files为2,dist文件夹会包括一个python##.dll文件,如果为1则不会。

如果没有使用zipfile=None,还会生成一个library.zip文件。

6.常见问题

6.1 error: MSVCP90.dll: No such file or directory

解决方法,按如上程序,将该dll写入dll_excludes中。

在其他电脑如果无法运行,可能是由于该电脑中没有安装Microsoft Visual C++ 2008 Redistributable - x86造成的,请到微软官网上下载安装该程序,或将MSVCP90.dll放入dist文件夹(注意:方法未验证)

6.2 error: bundle-files 1 not yet supported on win64

对于64位的Py2exe而言,bundle_files选项目前仍不可用,无法生成为单文件。

6.3 图标等不显示

网上的一种说法是这是Py2exe打包时没有将其打包进来造成的,可以将“Python\Lib\site-packages\PyQt4\plugins\imageformats”文件夹复制到dist目录下,再执行打包脚本。不过我在实验的过程中并没有发现这个问题。

当然,一定要注意,把你图标按照程序中写的位置放入到dist目录下。否则,当然不会显示。

6.4 执行程序有命令行的黑框

将setup函数中的console改为windows。

本文内容遵从CC3.0版权协议,转载请注明:转自Pythoner

本文链接地址:使用Py2exe将PyQt程序打包为exe文件

  1. 将setup函数中的console改为windows。 我就是来找这句话的。。。。感谢啊~~~

  2. 对我有用,谢谢楼主分享!

      • 2017/08/09 11:23上午

      Traceback (most recent call last):
      File “YBAssist.pyw”, line 2, in
      File “zipextimporter.pyo”, line 82, in load_module
      File “PySide\__init__.pyo”, line 41, in
      File “PySide\__init__.pyo”, line 11, in _setupQtDirectories
      File “PySide\_utils.pyo”, line 97, in get_pyside_dir
      File “PySide\_utils.pyo”, line 88, in _get_win32_case_sensitive_name
      File “PySide\_utils.pyo”, line 63, in _get_win32_short_name
      WindowsError: [Error 3] 系统找不到指定的路径。
      这个怎么解决

    • 捕捉流星的孩子
    • 2014/06/03 3:52下午

    博主,请教一个问题,我安装你教程说的实现时候,dist文件夹下是空的,不知道是什么问题

    • 捕捉流星的孩子
    • 2014/06/03 4:17下午

    博主,我知道原因了,我脑残了。。

    • MCR
    • 2015/02/18 3:15下午

    请问用win7 64位电脑,64位python3.4 和64位py2exe能生成可以在32位电脑上运行的exe文件吗?我试过一次,不行,那有什么解决办法吗?

      • alioth310
      • 2015/02/19 2:01上午

      不好意思,这个我没尝试过

    • Stephen
    • 2015/05/14 7:00下午

    博主,我按照你的做了,提示no module name sip ,然后google找到方法,在python setup.py py2exe后加 –include sip 。可是在日志里还是显示no module name sip。怎么办呀

      • 放大师傅
      • 2015/05/30 5:38下午

      你需要在你的打包程序里,import sip 下

    • jermyn
    • 2016/06/09 5:29下午

    我想问你们打包后的exe启动慢不慢

    • miliy
    • 2016/10/10 4:51下午

    Traceback (most recent call last):
    File “main.py”, line 11, in
    File “usb_test.pyo”, line 6, in
    ImportError: No module named pywinusb.hid

    已经在打包程序里面加了 import pywinusb.hid

[em_zan] [em_yali] [em_xiao] [em_xhj] [em_tucao] [em_tu] [em_tiaopi] [em_sx] [em_sdz] [em_sbq] [em_mobai] [em_kzh] [em_ku] [em_ksh] [em_keai] [em_jiong] [em_jing] [em_hx] [em_han] [em_ganga] [em_daxiao] [em_cool] [em_chi] [em_bu] [em_bizui] [em_ai]

return top