软件环境: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打包时没有将其打包进来造成的,可以将“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文件

  • 用命令行执行程序

    将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:\Python33\Lib\site-packages\PyQt5\libEGL.dll"]),
("platforms",
[r"C:\Python33\Lib\site-packages\PyQt5\plugins\platforms\qwindows.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)

使用py2exe打包你的py程序的更多相关文章

  1. 通过py2exe打包python程序的过程中,解决的一系列问题

    py2exe的使用方法参考<py2exe使用方法>. 注:程序可以在解释器中正常运行,一切问题都出在打包过程中. 问题1: 现象:RuntimeError: maximum recursi ...

  2. 使用 py2exe 打包 Python 程序

    上回在<使用 PyInstaller 打包 Python 程序>中,我们介绍了使用 PyInstaller 对 Python 程序进行打包,今天带大家认识一个新的工具:py2exe. 接下 ...

  3. Python学习笔记:py2exe打包Python程序

    使用py2exe将一个Python程序打包成一个exe程序,这样Python程序也可以在没有安装Python的环境中运行Python程序了.使用这个工具需要写一个用于打包的setup.py文件(名称可 ...

  4. pyinstaller打包.py程序为.exe操作指南

    pyinstaller打包.py程序为.exe操作指南 20190526内容纲要: 1.pyinstaller安装 2.程序封装 3.可执行程序 0 前言 今天第一次试试将一个py程序封装成一个.ex ...

  5. 使用pyinstaller打包.py程序

    使用pyinstaller打包.py程序 例如打包D:/Desktop 目录下的 filename.py 文件 打开 cmd 将目录切换至 D:/Desktop 输入命令 pyinstaller -F ...

  6. Pyinstaller通过spec文件打包py程序(多个py脚本)

    Pyinstaller pyinstaller是python的一个第三方模块,使用它可以将python程序打包为可执行文件,实现打包后的程序在没有python环境的机器上也可以运行.pyinstall ...

  7. py2exe 打包scipy时遇到的问题

    最近写了个小程序,用PyQt5做的界面,写完之后用py2exe打包成独立的exe文件,运行正常. 后来由于需要,调用SciPy.io.loadmat,改写setup.py,打包之后运行错误,提示: T ...

  8. python+pygame游戏开发之使用Py2exe打包游戏

    最近在用python+pygame 开发游戏,写完以后在分享给朋友玩的时候遇到了很大的问题,只有搭建了环境才能运行python脚本. 这会吓退99%以上的人……所以把我们的游戏打包(注意是打包而不是编 ...

  9. pyinstaller打包第一个wxPython程序HelloWorld

    pyinstaller 打包hello 7Mb ================= www.pyinstaller.org pip install pypiwin32 pip install pyin ...

随机推荐

  1. python(21)实现多进程

    参考链接:http://www.cnblogs.com/kaituorensheng/p/4445418.html python多进程:multiprocessing python中的多线程其实并不是 ...

  2. PHPStorm+XDebug进行调试图文教程以及解析wamp的php.ini设置不生效的原因

    这篇文章主要为大家详细介绍了PHPStorm+XDebug进行调试图文教程,内容很丰富,具有一定的参考价值,感兴趣的小伙伴们可以参考一下   笔者的开发环境如下:Windows8.1+Apache+P ...

  3. tcpdump命令--实用篇

    //查看本机与mysql的操作命令 注意 -i any表示监听所有网络接口,我们也根据自身情况选择网络接口 #tcpdump -i any -w - dst port 3306 |strings // ...

  4. js手机短信按钮倒计时

    /*   120秒手机短信按钮倒计时   */    exports.sendmessage = function (name) {        var second = 120; $(name). ...

  5. js监听浏览器关闭事件

    html : <HTML>  <HEAD>  <title>test</title>  </HEAD>  <body onbefore ...

  6. Java SE 第九讲---面向对象特征之封装1

    1.面向对象程序设计的三大基本特征:继承(Inheritence).封装(Encapsulation).多态(Polymorphism) 2.封装:类包含数据与方法,将数据与方法放在一个类中就构成了封 ...

  7. java学习_文件工具类

    工具类里面的方法全部都是静态的,调用的时候不需要实例化

  8. python 装饰器和 functools 模块

    转自:http://blog.jkey.lu/2013/03/15/python-decorator-and-functools-module/ 什么是装饰器? 在 python 语言里第一次看到装饰 ...

  9. [SQL]SqL给局部变量赋值有两种方法

    给局部变量赋值有两种方法: .SET @variable_name=value .SELECT @variable_name=value 两者的区别:SET赋值语句一般用于赋给变量一个指定的常量,SE ...

  10. task中的一些属性

    1.android:allowTaskReparenting 这个属性用来标记一个Activity实例在当前应用退居后台后,是否能从启动它的那个task移动到有共同affinity的task,“tru ...