使用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信息如下:



  
    
      
        
        
      
    
  
  
    
      
    
  


这里可以看到,我的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加载错误。

- EOF -