专栏首页码农帮派wxPython_06_将Python源代码打包成exe可执行文件

wxPython_06_将Python源代码打包成exe可执行文件

python的源代码要在没有安装/配置Python相关开发环境的电脑上运行,那么就需要使用工具对源代码进行打包,在windows上运行则必须打包成exe可执行文件,现在常用的打包工具有:

py2exe,PyInstaller 以及 cx-Freeze0

  • PyInstaller打包太慢,过程太长;
  • cx-Freeze可以说飞速打包;
  • py2exe打包相对比较麻烦,需要另外写一个Python的脚本文件.

下面使用py2exe工具打包Python源码,针对我打包过程中遇到的问题,给出解决办法。

使用py2exe打包需要写一个Python的脚本文件:

#coding=utf-8
from distutils.core import setup
import py2exe
import glob
#
libRootPath = r'D:\ProgramStudy\python278'
 
data_files = ["E:\python_p\logo.ico",
              (r'mpl-data', glob.glob(libRootPath+r'\Lib\site-packages\matplotlib\mpl-data\*.*')),
              (r'mpl-data', [libRootPath+r'\Lib\site-packages\matplotlib\mpl-data\matplotlibrc']),
              (r'mpl-data\images', glob.glob(libRootPath+r'\Lib\site-packages\matplotlib\mpl-data\images\*.*')),
              (r'mpl-data\fonts', glob.glob(libRootPath+r'\Lib\site-packages\matplotlib\mpl-data\fonts\*.*'))]
 
setup(
    windows=[
        {
            "script":'study_main.py',
            "icon_resources":[(1, "logo.ico")]
        }],
    options = {
        'py2exe':
             {
               'dll_excludes':['MSVCP90.dll', 'numpy-atlas.dll'],
                "includes": ["matplotlib.backends", "matplotlib.figure", "pylab", "numpy", "matplotlib.backends.backend_tkagg"],
                'excludes': ['_gtkagg', '_tkagg', '_agg2', '_cairo', '_cocoaagg', '_fltkagg', '_gtk', '_gtkcairo', ]
             }
    },
    data_files=data_files
)

【说明】

(1)需要安装py2exe的Python库,可以使用pip install安装工具,也可以在官网下载安装;

(2)由于打包的过程会需要很多dll动态链接库文件,以及lib文件,需要我们在data_file中指定这些文件的位置,是在你电脑中Python安装目录下,由于我的项目中使用到了matplotlib来画图,所以会用到Python/Lib下matplotlib的lib和dll文件;

(3)第8行,指定了项目的logo所在的位置,需要时ico格式的图片,win7上logo无法正常显示,需要下载Greenfish Icon Editor Pro软件对你的icon文件进行处理,处理方法网上有;

(4)第17行,指定项目的入口文件,无论项目的文件有多少个,此处只需要指定入口的那个文件,就是有:

if __name__ == "__main__":
    main()

的文件;

(5)第23行,使用py2exe打包可能会有下面的错误:

Error: “MSVCP90.dll: No such file or directory”

(上面的报错可以在 http://stackoverflow.com/questions/12127869/error-msvcp90-dll-no-such-file-or-directory-even-though-microsoft-visual-c 看到)

此时就需要加第23行的这一句,本项目中使用matplotlib画图,而matplotlib是依赖numpy库的,同时可能会报numpy-atlas.dll no such file的错误,同样可以添加。

(6)numpy-atlas.dll的缺失,会导致程序打包正常,但点击打包之后的exe没有任何反应,可能失去少某些dll动态链接库文件,numpy-atlas.dll库文件在python安装目录下,搜索一下就找到了,另外,要是exe可执行文件点击之后没有反应,可以将其拖拽到cmd命令行中执行,会打印出出现的错误。

完成了上面的脚本文件之后,在命令行中执行打包操作:

python setup.py py2exe

就开始自动打包。

【注意】上面setup.py文件就是上面编写的打包脚本。

【其他需要说明的】

(1)兼容性:

不同的系统上文件系统的路径表示的格式是不太相同的,比如我们项目的用到的图片都放在项目根目录下的icon文件夹下,一种不太正确的路径定位方式:

import os.path
 
main_dir = os.path.split(os.path.abspath(__file__))[0]
iconRootPath = main_dir+os.sep+"icon"

正确的定位方式:

import os.path
 
iconRootPath = os.getcwdu()+os.sep+"icon"

os.getcwdu() 指向了当前项目,也就是打包后exe可执行文件所在的目录,一般不要使用斜杠或者反斜杠作为分隔符,而是使用os.sep。

(2)项目结构

使用py2exe打包之后的文件夹中除了一大堆dll,lib文件之外,可以找到那个exe可执行文件,但我们点击之后,回报各种资源文件找不到,加入我们在项目中使用了图片,那么需要把图片文件夹额外拷贝到项目目录下,数据库文件等等,py2exe打包过程是不会把这些资源文件打包进来的,需要手动拷贝进来:

(3)sRGB警告

在win7系统中,微软提高了对图片质量的检测,项目中的图片可能会弹出下面的警告框:

"iccp known incorrect sRGB profile" 警告(点击查看另外一篇文章)

这不是错误,但为了提高用户的体验,需要将这个框 去除,可以使用ImageMagick对图片进行转换,其实是该软件中magick.exe这个工具进行图片转换的:

e.g. 使用magick.exe对D盘下的logo_sys.png进行转换,在cmd中执行:

magick.exe D:\logo_sys.png D:\logo_sys.png

下面的程序可以批量处理文件夹下所有的图片文件:

import os
# rootPath是需要转换的图片所在的根目录
rootPath = "D:/icon"
# magick.exe所在的路径
commandTool = os.getcwdu()+os.sep+"tools"+os.sep+'magick.exe'
# 获得rootPath目录下所有图片文件的全路径
def FindExamAllFiles():
    tmp = []
    for root, dirs, files in os.walk(rootPath):
        for filepath in files:
            imgFileFullPath = os.path.join(root, filepath)
            if imgFileFullPath.endswith('.png'):
                tmp.append(imgFileFullPath)
    return tmp
 
if __name__ == "__main__":
    pngPathList = FindExamAllFiles()
    for pngPath in pngPathList:
        # 拼凑cmd命令
        command = "{0} {1} {2}".format(commandTool, pngPath, pngPath)
        os.system(command)

要是我们的应用会涉及到用户自主导入图片的操作,为了保证不弹出sRGB警告框,可以在每次读入图片文件之后,调用下面的函数,首先对图片进行sRGB处理:

import platform

# 处理文件夹中单个的图片 
def convertsRGBImageFromTmp(iconFullPath): 
  winVerName = platform.win32_ver()[0] 
  if winVerName != None and winVerName.upper() == 'XP': 
    return  
  else: 
    command = "{0} {1} {2}".format(commandTool, iconFullPath, iconFullPath) 
  
  try: 
    os.system(command) 
  except:
    pass  

  pass

因为sRGB的检测是在win7以及之后版本的系统上才有的,在XP的系统上是无需进行该操作的,Python提供了platform这个库来检测当前系统的版本,我们可以使用platform.win32_ver()[0]获得版本的名称,并进行不同的操作。

【下载】magick.exe文件和Python转换代码文件的下载

(http://download.csdn.net/detail/tianmaxingkong_/9734281)

(4)权限说明

正常情况下,windows系统允许你的应用从其他的路径下读取文件,但是一般不允许应用在 除应用根目录及以下的其他目录中写内容,即,你可以读取windows上大多数文件系统中的文件,只允许往os.getcwdu()目录下写内容,其他路径是不允许写操作的。

本文分享自微信公众号 - 码农帮派(gh_f084b040e9f9),作者:码农帮派

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python基础学习_05_文件操作

    file(name, [mode, [buffering]] ) -> file object 和 open(name, [ mode, [ bufferi...

    码农帮派
  • Python基础学习_08_进程和线程操作

    每个运行的进程,系统都会分配一个相关的运行环境,一般的可以将该运行环境认为是进程环境变量的集合,当进程启动的时候,环境变量就确定了,只有当前进程才能够修改其环...

    码农帮派
  • Go学习_30_Golang代码性能分析工具

    Golang内置了一些性能分析工具,可以将性能分析的结果文件输出,我们可以使用图形化的工具查看分析结果,在使用这些工具之前,我们需要安装一些工具,以便于查看分析...

    码农帮派
  • 从smart漫谈打包

    项目构建迁移到fis体系后,打包的问题就跟着来了。打包的基本方式是:分析依赖,合并文件,解决引入。 CSS处理方式 来源 link 引入 require 引入 ...

    IMWeb前端团队
  • 【Android】多渠道打包,其实可以更快

    Gavin-ZYX
  • 从smart漫谈打包

    项目构建迁移到fis体系后,打包的问题就跟着来了。打包的基本方式是:分析依赖,合并文件,解决引入。

    IMWeb前端团队
  • 打包巨慢怎么办?这些工具让你爱不释手 | 码云周刊第 58 期

    测试小妹 程序测试不通过,已经打回重审啦,你重新再做下单元测试哦… OS : 每次修改一个问题,我都要重新 clean -> 编译打包 -> 上传 fir,最后...

    码云Gitee
  • Python--读取csv文件的整列

    明天依旧可好
  • FPGA 高手养成记-Test bench文件结构一览无余

    Verilog测试平台是一个例化的待测(MUT)模块,重要的是给它施加激励并观测其输出。逻辑模块与其对应的测试平台共同组成仿真模型,应用这个模型可以测试...

    碎碎思
  • 知乎大学上线,知识付费OUT了,知识即服务时代来临

    6月6日,知乎宣布,旗下“知识市场”正式更名为“知乎大学”,升级后的“知乎大学”,将基于由“课”+“书”+“训练营”共同组成的内容体系,为用户提供涵盖通识知识、...

    罗超频道

扫码关注云+社区

领取腾讯云代金券