Python笔记——Python3.4+PyQt5+Pycharm4.0.4程序py2exe打包步骤

PyQt5程序py2exe打包发布exe文件步骤


注:WINDOWS环境下

开发环境:Python3.4 + PyQt5 + Pycharm4.0.4


转载自:http://bbs.fishc.com/thread-60551-1-1.html点击打开链接

并做了部分修改,具体详细步骤如下:

先说成功经历:1、打包Python3.3+PyQt5程序2、打包普通程序在他人电脑上运行
再说说打包工具,基本上现在在网上看到就三种,pyinstaller、cxfreeze、py2exe
pyinstaller:没用过不予评论
cxfreeze:用过打包PyQt程序的时候出了些问题,没在其它人电脑上运行过打包的程序
py2exe:这个网上一致评价说不错,但是网上说没有python3的版本而作罢,但是近期找了教程,然后找到了python3版本的py2exe,下面详说

 

有些鱼油说难,其实打包过程就两步:
1、安装py2exe
2、把改好的setup.py放在你要打包的代码文件同一目录运行
其中,第2步里的setup.py文件,主要是把windows = ['sample.py',]这句中的sample.py改成你要打包的代码文件的名字,其它不动即可,不明白的同学请先看下面的教程再回来看这里

最后教程部分,以下教程基于windows 7 64位,打包过程经python3.3.2+PyQt5验证可用
1、安装部分
(1)py2exe下载网址:http://www.lfd.uci.edu/~gohlke/pythonlibs/   点击打开链接
        搜索py2exe,在你搜索到的位置看到这样的条目
        py2exe0.9.2.2cp34nonewin_amd64.whl
        0.9.2.2:py2exe版本号;cp34:python版本号;win_amd64:系统位数
        下载和你的python版本和系统位数相对应的py2exe版本

        如图:

    

(2)安装方法:下载好后在命令行下输入 pip install 下载文件绝对路比如你下载在C盘根目录,则输入:
        pip install c:\py2exe0.9.2.2cp34nonewin_amd64.whl

 

具体看下面图片:



2、打包部分
在你要打包的代码文件(比如sample.py)的同文件夹建立一个python代码文件(比如setup.py),然后在其中输入:


from distutils.core import setup

import py2exe

import sys

 

#this allows to run it with a simple double click.

sys.argv.append('py2exe')

 

py2exe_options = {

        "includes": ["sip"],  # 如果打包文件中有PyQt代码,则这句为必须添加的

        "dll_excludes": ["MSVCP90.dll",],  # 这句必须有,不然打包后的程序运行时会报找不到MSVCP90.dll,如果打包过程中找不到这个文件,请安装相应的库

        "compressed": 1,

        "optimize": 2,

        "ascii": 0,

        "bundle_files": 1,  # 关于这个参数请看第三部分中的问题(2)

        }

 

setup(

      name = 'PyQt Demo',

      version = '1.0',

      windows = ['sample.py',],   # 括号中更改为你要打包的代码文件名

      zipfile = None,

      options = {'py2exe': py2exe_options}

      )

3、一些可能出现的问
(1)error: MSVCP90.dll: No such file or directory

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

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

 

(2)error: bundle-files 1 not yet supported on win64

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

有同学提意见说这个选项在64位中只能是3,如果出现这个错误的同学可以尝试,但是本人亲测win7 64位,python3.3.2打包成功,并在别人的电脑上运行过,根据我的系统位数和python版本,我在上面提到的网址下载的py2exe程序是这个

py2exe-0.9.2.2-cp33-none-win_amd64.whl

 

(3)图标等不显示

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

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

PS: 这里说一下,如果你的程序里面用到了绝对路径类似于"C:\users\user_name\1.txt"这样的,在别人的电脑上运行时必须把这个 1.txt放到别人电脑的C:\users\user_name\目录下,这样会非常麻烦,解决办法是在程序的最前方加上这样的语句

import sys, os

sys.path.append(os.getcwd())  # 把当前路径(即程序所在路径)暂时加入系统的path变量中


在程序运行期间,系统会把程序所在路径也作为搜索路径,这样可以直接用相对路径就可以了,比如"\user_name\1.txt"就是指你的程序所在路径下的user_name文件夹中的1.txt文件

 

(4)用命令行执行程序

将setup函数中的windows改为console。

 

(5)关于PyQt5程序打包时遇到的一些问题

This application failed to start because it could not find or load the Qt platform plugin "windows".

    根据这个贴http://blog.csdn.net/windows_nt/article/details/24205671,将PyQt5目录下的 platforms文件夹拷入,在自己的电脑上正常运行;然后将程序(包括新加的platforms文件夹)拷到别人电脑上运行,依然错误根据这个贴 http://www.tuicool.com/articles/eqINru,将PyQt5目录下的libEGL.dll文件拷入程序所在目录,运行 正常,另外,这个贴子还提到,只保留platforms目录下的qwindows.dll,程序可以运行
在idle里运行正常,但是打包出来的程序运行就直接停止工作
这个问题仅在win764位下打包出现的(在32位系统中运行打包后的程序会提示缺少Qt5Core.dll和Qt5Gui.dll),由于代码中并未用 到QtCore和QtGui模块,于是在导入时并未导入,出现这个问题后,经过曲折的过程,终于发现pyqt5的程序,不论你用未在代码中用到 QtCore和QtGui都需要将其导入。另外说一下怎么发现这个问题的,我把代码传给Wei_Y小哥,他在自己的机器打包之后运行提示缺少 Qt5Core.dll和Qt5Gui.dll,然后他将两个文件加入正常运行,于是我尝试直接将两个模块导入,打包成功。

 

    综上可以下,对于PyQt5程序打包时,需要注意以下两点:

· 需要在setup.py文件中的windows = ['sample.py',],这一句后面加上

data_files=[("",

                   [r"C:\Python33\Lib\site-packages\PyQt5\libEGL.dll"]),

                  ("platforms",

                   [r"C:\Python33\Lib\site-packages\PyQt5\plugins\platforms\qwindows.dll"])],

注:这里的路径根据你自己安装的Python版本来定如:

      data_files=[("",
                   [r"F:\Python\python34\Lib\site-packages\PyQt5\libEGL.dll"]),
                  ("platforms",
                   [r"F:\Python\python34\Lib\site-packages\PyQt5\plugins\platforms\qwindows.dll"])],


 

setup()函数的data_files参数是一个列表,列表中包含1个或多个元组。元组的第一个元素是一个字符串,表示你准备复制过来的文件所放的文 件夹,相对于你的程序所在位置的相对路径(""表示和你的程序在同一目录);元组的第二个元素是一个列表,列表中的元素是你所要放在这个文件夹中的文件的 路径(注意,这个路径是指你所要复制的文件所在的位置,需要绝对路径)。所以上面的语句是将qwindows.dll拷贝到程序所在目录下的 platforms文件夹中,而将libEGL.dll放在程序所在的文件夹中。
更改后的setup.py如下:

 

from distutils.core import setup

import py2exe

import sys

 

#this allows to run it with a simple double click.

sys.argv.append('py2exe')

 

py2exe_options = {

        "includes": ["sip"],

        "dll_excludes": ["MSVCP90.dll",],

        "compressed": 1,

        "optimize": 2,

        "ascii": 0,

        "bundle_files": 1,

        }

 

setup(

      name = 'sample',

      version = '1.0',

      windows = ['sample.py',],

      data_files=[("",

                   [r"C:\Python33\Lib\site-packages\PyQt5\libEGL.dll"]),

                  ("platforms",

                   [r"C:\Python33\Lib\site-packages\PyQt5\plugins\platforms\qwindows.dll"])],

      zipfile = None,

      options = {'py2exe': py2exe_options}

      )


  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值