使用py2exe打包pyqt程序为exe

使用python和pyqt写界面程序实在是很方便,但是写出的py程序只能在安装了python环境的机器上运行,于是需要py2exe这种工具,将py程序打包成exe,就能在其他机器上运行了。

然而第一次发布exe还是走了不少弯路的,这里记录下来以供借鉴。

首先是安装py2exe,我使用的python版本是2.6,这是比较好用的一个版本了,与很多第三方包都兼容的比较完美。直接去http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/这里,下载py2exe-0.6.9.win32-py2.6.exe,注意一定要下载这个,不管你是32位系统还是64位系统,不要尝试64位那个版本哦。傻瓜型安装,一路下一步就可以了。

第二步,在工程文件夹下新建一个setup.py的文件,拷贝如下代码:

from distutils.core import setup
import py2exe

py2exe_options = {
        "includes":["sip",],
        }

setup(windows=["yourmainfile.py"], options={'py2exe':py2exe_options})

其中,”yourmainfile.py”是你的程序的主函数所在的文件,而”includes”:[“sip”,]这一句是pyqt程序需要添加的(如果程序里面没有用到pyqt不用写这一句),不然会在后面执行py2exe的时候出错。

第三步,最重要的一步呢,首先检查你的机器里有没有msvcm90.dll、msvcp90.dll、msvcr90.dll这三个文件,如果有,它的目录是不是包含在了系统路径里。为了不产生运行dll版本错误,一定要把系统路径里有这三个dll的目录都删除。然后,检查你的python.exe的manifest,看他用了哪个版本的dll,方法是使用vs2008自带的一个程序,打开命令行到python所在目录,运行mt.exe -inputresource:python.exe;#1 -out:1.txt,这样就会把python.exe的manifest信息拷贝到1.txt这个文件里,放在python.exe同级目录下。我的python.exe的manifest信息如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false">
        </requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" 
processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>

这里可以看到,我的python.exe使用的VC90版本是9.0.21022.8,因此需要拷贝一套这个版本的msvcm90.dll、msvcp90.dll、msvcr90.dll到工程文件夹来。VC90.CRT-9.0.21022.8是这个版本的dll们。

第四步,在命令行中运行py2exe,打开命令行到工程文件目录,运行python setup.py py2exe,OK,大功告成,运行完毕后会在工程文件夹下生产一个dist目录,里面就是exe用到的所有文件啦~!这样把这个文件夹直接拷贝到其他机器上就能运行了!

注意事项:
①一定要保证系统路径下没有包含msvcm90.dll、msvcp90.dll、msvcr90.dll这三个dll的路径!不然很容易发生加载错误。提示:letax、mysql等软件里面都有这些dll,且无法保证与python.exe所用版本一致。
②如果不把正确版本的三个dll拷贝到工程文件夹下,则“python setup.py py2exe”这一步无法正确执行,报错为找不到msvcp90.dll。
③如果使用了错误版本的dll,则“python setup.py py2exe”这一步能够执行完成,但是生成的exe无法运行,报错为R6034加载错误。

This entry was posted in python. Bookmark the permalink.

4 Responses to 使用py2exe打包pyqt程序为exe

  1. 深蓝 says:

    呵呵,楼主你好,我写个了程序想用py2exe发布,在网上上搜了很久,基本都是你我互超的,但是我至今不明白一点,py2exe只能在window上安装么,我的程序是在ubuntu上写的,怎么打包,怎么都没有说名这个问题的阿?对我们菜鸟来说,这个不明白,怎么往下弄呢,哈哈,请指教阿

  2. haiyang says:

    感谢分享,这篇文章帮了我大忙

  3. Pingback: 我爱 Python | 杨海坡的网志

Leave a Reply

Your email address will not be published. Required fields are marked *