• 使用py2exe打包你的py程序


    软件环境:python3.3.4 + PyQt5

    使用py2exe打包写好的py文件,过程如下:

    在你要打包的代码文件(比如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}
          )
    

    一些可能出现的问题:

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

    • 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

    • 图标等不显示
      网上的一种说法是这是Py2exe打包时没有将其打包进来造成的,可以将“PythonLibsite-packagesPyQt4pluginsimageformats”文件夹复制到dist目录下,再执行打包脚本。不过我在实验的过程中并没有发现这个问题。
      当然,一定要注意,把你图标按照程序中写的位置放入到dist目录下。否则,当然不会显示。
      PS:这里说一下,如果你的程序里面用到了绝对路径类似于 "C:usersuser_name1.txt" 这样的,在别人的电脑上运行时必须把这个1.txt放到别人电脑的 "C:usersuser_name" 目录下,这样会非常麻烦,解决办法是在程序的最前方加上这样的语句

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

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

    • 用命令行执行程序
      将setup函数中的windows改为console。

    • 关于PyQt5程序打包时遇到的一些问题

      • This application failed to start because it could not find or load the Qt platform plugin "windows"
        根据这个贴子链接,将PyQt5目录下的platforms文件夹拷入,在自己的电脑上正常运行;然后将程序(包括新加的platforms文件夹)拷到别人电脑上运行,依然错误根据这个贴子链接,将PyQt5目录下的libEGL.dll文件拷入程序所在目录,运行正常,另外,这个贴子还提到,只保留platforms目录下的qwindows.dll,程序可以运行
      • 在idle里运行正常,但是打包出来的程序运行就直接停止工作
        这个问题仅在win764位下打包出现的(在32位系统中运行打包后的程序会提示缺少Qt5Core.dll和Qt5Gui.dll),由于代码中并未用到QtCore和QtGui模块,于是在导入时并未导入。解决办法:直接将两个模块导入,打包成功。

    综上可以下,对于PyQt5程序打包时,需要注意以下两点:
    需要在setup.py文件中的windows = ['sample.py',], 这一句后面加上

    data_files=[("",
                       [r"C:Python33Libsite-packagesPyQt5libEGL.dll"]),
                      ("platforms",
                       [r"C:Python33Libsite-packagesPyQt5pluginsplatformsqwindows.dll"])],
    

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

    即使你只用到QtWidgets模块,也要同时导入QtCore和QtGui,也就是在代码前面必须加上

    import QtWidgets, QtCore, QtGui
    

    py2exe的安装步骤:

    py2exe‑0.9.2.2‑cp34‑none‑win_amd64.whl
    
    0.9.2.2:py2exe版本号;
    cp34:python版本号;
    win_amd64:系统位数
    
    • 安装方法:下载好后在命令行下输入 pip install
      下载文件绝对路比如你下载在C盘根目录,则输入

      pip install c:py2exe‑0.9.2.2‑cp34‑none‑win_amd64.whl

    以上内容摘自鱼C论坛:Python3代码打包教程(用py2exe把你的代码变成exe)

  • 相关阅读:
    冲刺会议第七天
    冲刺会议第六天
    冲刺会议第五天
    冲刺会议第四天
    题目
    关于小程序开发者和体验者的数据请求问题
    focus、blur事件的事件委托处理(兼容各个流浏览器)
    收集的一些技术论坛博客
    ios下fixed回复框bug的解决方案
    jQuery的13个优点
  • 原文地址:https://www.cnblogs.com/christsong/p/5622828.html
Copyright © 2020-2023  润新知