由py2exe引发的问题及解决方案

py2exe 的简介

 

    py2exe是一种python发布工具,可以用来将 python 脚本转换成 windows 下的可执行程序,而且不需要安装 python 环境便可运行。
 
    py2exe 现在可以用来创建使用了 wxPython, Tkinter, Pmw, PyGTK, pygame, win32com client 以及 server 等模块的程序。

要使用py2exe编译工具,首先要安装。python自身不带这个功能。

关于py2exe的基本用法:

1、首先需要我们自己手写一个setup.py程序,内容为:

from distutils.croe import setup  ''' distutils 是python 内建的模块。这里从distutils里导入setup方法。'''
import py2exe                            ''' 导入py2exe模块'''

setup(console=['myprogram.py'])   '''console后面跟的是一个列表。此处的myprogram.py是你要编译的.py程序
                                                          这里我使用了console这个参数,它表示的是程序运行在命令提示符下,也就是DOS窗口里。或                                                      者说是CMD.exe里。如果你的python里使用了图形组建,即:GUI,那么就要把console改成                                                      windows。'''

把上面这段代码保存后,我们切换到cmd.exe里,运行下面的命令:

python setup.py py2exe

就会出现编译过程,最后会生成两个文件夹:build 和dist ,其中dist目录里面存放的是你编译好的可执行文件myprogram.exe,此时,你就可以直接运行这个生成的.exe文件了。另一个build目录是临时文件可以删除。当你在其他没有python环境的系统上运行必要的文件:
*.pyd,
library.zip,
MSVCR71.dll
python*.dll
这几个文件是必须要和生成的.exe 文件放在一起。

以上是最基本的编译方法。

不过在我测试的时候出现了问题。

我用pyqt4写了一个最简单的小程序,功能就是显示一个窗口。文件名称是window.py 代码如下:

#!/usr/bin/python
#filename:window.py
import sys
from PyQt4 import QtCore,QtGui

class Mywindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setWindowTitle('my first pyqt window')
        self.resize(300,200)

app=QtGui.QApplication(sys.argv)
mywindow=Mywindow()
mywindow.show()
app.exec_()

用来编译的setup.py代码如下:

#!/usr/bin/python
#filename:setup.py

from distutils.core import setup
import py2exe

setup(windows=["window.py"])

整个编译过程都很顺利,可是当我运行编译好的window.exe文件的时候,出现了错误提示:

Traceback (most recent call last):
  File "window.py", line 5, in <module>
  File "PyQt4/QtCore.pyc", line 12, in <module>
  File "PyQt4/QtCore.pyc", line 10, in __load
ImportError: No module named sip


这让我很困惑,后来去搜索了一下得到如下解决方法:

#!/usr/bin/python
#filename:setup.py

from distutils.core import setup
import py2exe

setup(windows=[{"script":"myprogram.py"}], options={"py2exe":{"includes":["sip"]}})

这样再次编译一下,程序可以正常运行,这其中的关键是在与setup这个函数可以带很多参数,我就是因为不了解setup所以出现了比较困惑的问题。

关于更多py2exe的使用方法和更多参数介绍,目前还没找到更详细的介绍,只在http://li2z.cn/里面找到了这一段:不过我觉得写算是比较详细的了。其中我做了些小小的改动。在此对作者表示歉意!

   1. 打包文件最好要和你的主程序文件放在同一目录下.我曾经试着把打包文件放在上级目录,结果在搜索依赖库的时候遇到了很多麻烦.
   2. 打包文件本身其实也是一个python的程序,虽然一般只有一个setup函数.此函数可以有 name,description,version,console,windows,options,data_files 等参数.
   3. 要生成一个或多个命令行的exe,setup需要一个List型的名为console参数,指名源py文件.
   4. 要生成一个或多个GUI的exe,setup需要一个List型的名为windows参数,指名源py文件.List的每项都可以有图标等选项, 就是icon_resources哪里,图标也是个Tuple的List,但是windows一般只会显示出第一个图标,所以一个就够了.
   5. 如果你想用png文件直接当图标,那很可能会在生成exe的时候,引起python崩溃,所以还是赶紧转成ico吧
   6. 如果你和我一样,生成的GUI的exe文件,在执行的时候,报 ImportError: No module named cairo ,那最好在setup函数里加上options,里面有include cairo的选项.
   7. 如果你也有数据文件(比如glade文件,图片文件等),py2exe默认并不会帮你一起打包,你需要在setup函数中加传 data_files参数.data_files需要是一个List,每项可以是直接指向数据文件的字符串,也可以是一个Tuple;如果是前者,数据文件会直接在生成的dist目录下面,如果是后者,Tuple的第一个元素是目标目录,第二个元素是是个源文件名的List,效果是把所有的源文件存放在 dist下的指定的目标目录下.(呃,好长好拗口…)
   8. 在py2exe生成的环境中,__file__这个应用将失效,这个问题的解决方法可以参看http://www.py2exe.org/index.cgi/WhereAmI 这里.个人觉得Alternate Solution更加靠谱.
   9. 好了,现在如果你已经写好了打包文件(win_packer.py),也对源代码进行了应有的修改,你就可以执行 python win_packer.py py2exe 来生成exe了,执行此命令会在当前目录下多出一个 dist 目录,你只要把dist目录复制出来,运行里面的exe,就可以了
  10. 最后,如果你的GUI程序还是运行不了,你还需要手工将你的GTK+安装安装目录(默认是C:/GTK)下的etc和lib目录复制到dist目录。

 

全文完……

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值