Python之制作exe

发布时间:2022-04-22 09:59:43 人气:54 作者:多测师

  py2exe可将Python脚本转换为Windows可执行程序(*.exe),以便在未安装Python环境的windows主机上独立运行该程序。

  登录SourceForge,可下载并安装与当前Python环境对应的py2exe版本。安装后,在Lib\site-packages\py2exe\samples目录下可找到多个官方使用示例。

  在Python交互窗口中运行如下命令,可查看py2exe的帮助信息:

  >>> import py2exe

  >>> help(py2exe)

  Help on package py2exe:

  ... ... ... ... ...

  若使用简单的setup.py打包文件,即setup(console=['CLineCounter.py']),则执行打包命令python mysetup.py py2exe后将在当前目录下创建build(1.28M)和dist(4.96M)两个子目录。其中,dist子目录包含CLineCounter.exe、python27.dll、w9xpopen.exe、library.zip及若干.pyd文件。通常,dist子目录的文件需要一起发布。但w9xpopen.exe用于Windows98系统,可以删除。

  显然,发布一个文件包不如发布单个可执行程序。同时,文件包的体积显得过大(CLineCounter.py只有不到7K)。因此,需要压缩体积并制作单一的exe。

  要压缩文件包体积,首先通过py2exe输出日志分析其打包细节。为缩短篇幅,以下给出裁剪过的py2exe输出日志(行尾带省略号则表示该行后面省略若干行):

  running py2exe

  creating E:\PyTest\build

  creating E:\PyTest\build\bdist.win32 ...

  creating E:\PyTest\dist ...

  byte-compiling C:\Python27\lib\difflib.py to difflib.pyc ...

  byte-compiling C:\Python27\lib\doctest.py to doctest.pyc ...

  byte-compiling C:\Python27\lib\encodings\ascii.py to encodings\asc

  byte-compiling C:\Python27\lib\encodings\cp1252.py to encodings\cp1252.pyc ...

  byte-compiling C:\Python27\lib\encodings\gbk.py to encodings\gbk.pyc ...

  byte-compiling C:\Python27\lib\encodings\iso2022_jp.py to encodings\iso2022_jp.pyc ...

  byte-compiling C:\Python27\lib\encodings\iso8859_9.py to encodings\iso8859_9.pyc ...

  byte-compiling C:\Python27\lib\encodings\mac_arabic.py to encodings\mac_arabic.pyc ...

  byte-compiling C:\Python27\lib\encodings\shift_jis.py to encodings\shift_jis.pyc ...

  byte-compiling C:\Python27\lib\encodings\utf_8.py to encodings\utf_8.pyc ...

  byte-compiling C:\Python27\lib\optparse.py to optparse.pyc ...

  byte-compiling C:\Python27\lib\pdb.py to pdb.pyc

  byte-compiling C:\Python27\lib\pickle.py to pickle.pyc ...

  byte-compiling C:\Python27\lib\re.py to re.pyc ...

  byte-compiling C:\Python27\lib\threading.py to threading.pyc ...

  byte-compiling C:\Python27\lib\unittest\case.py to unittest\case.pyc ...

  *** copy extensions ***

  copying C:\Python27\DLLs\_hashlib.pyd -> E:\PyTest\dist ...

Python之制作exe

  可见,很多不需要的模块也被打包,如日文编码文件和unittest等。此时,可备份Lib\encodings目录,然后手动删除原目录下不需要的语言文件。其他模块则可通过打包文件excludes选项进行排除。

  综上,作者采用以下打包文件(命名为PackOneExe.py):

  #!/usr/bin/python

  #coding=utf-8

  from distutils.core import setup

  import py2exe, sys, shutil

  #若未提供命令行参数,则以静默模式创建可执行文件(exe)

  if len(sys.argv) == 1:

  sys.argv.append('py2exe')

  sys.argv.append('-q')

  TARGET_PY = 'CLineCounter.py'

  EXE_DIR = TARGET_PY[:-3] + '_exe'

  #includes = ['encodings', 'encodings_trim.*']

  includes = ['encodings', 'encodings.gbk', 'encodings.utf_8']

  excludes = ['unittest', 'doctest', 'optparse', 'difflib',

  'pdb', 'threading', 'subprocess', 'pickle']

  dll_excludes = ['msvcp90.dll', 'mswsock.dll', 'powrprof.dll', 'w9xpopen.exe']

  setup(

  options = {'py2exe': {'compressed': 1, #压缩

  'optimize': 2, #优化级别

  'ascii': 1, #不自动包含encodings和codecs

  'includes': includes, #待包含模块名的列表

  'excludes': excludes, #不予包含的模块名列表

  'dist_dir': EXE_DIR, #存放最终发布文件的目录

  'bundle_files': 1 #所有文件打包为一个exe文件

  }},

  zipfile = None, #不生成library.zip文件

  console = [TARGET_PY] #待转换为控制台exe的脚本文件列表

  )

  shutil.rmtree('build')

  其中,options的bundle_files项指定将pyd和dll文件打包到单个exe文件中。此外,setup使用zipfile=None禁止创建library.zip。注意,此处假定C代码统计工具仅涉及中英文字符编码,因此仅包含gbk和utf-8两个编码文件。若为保险起见,可包含精简过的encodings目录(如注释所示)。options的excludes项对应一些未用到且体积较大的模块文件。

  PackOneExe.py对应的py2exe输出日志局部如下:

  byte-compiling C:\Python27\lib\dummy_thread.py to dummy_thread.pyo

  byte-compiling C:\Python27\lib\encodings\__init__.py to encodings\__init__.pyo

  byte-compiling C:\Python27\lib\encodings\aliases.py to encodings\aliases.pyo

  byte-compiling C:\Python27\lib\encodings\gbk.py to encodings\gbk.pyo

  byte-compiling C:\Python27\lib\encodings\utf_8.py to encodings\utf_8.pyo

  byte-compiling C:\Python27\lib\functools.py to functools.pyo

  将打包文件PackOneExe.py和主程序文件CLineCounter.py放在同一目录下,运行如下命令:

  E:\PyTest>python PackOneExe.py py2exe > out.txt #或

  E:\PyTest>PackOneExe.py > out.txt

  则在CLineCounter_exe子目录下生成2.68M的CLineCounter.exe文件。可见,文件体积相比先前的文件包有显著的缩减。

  接着,使用UPX工具进一步地压缩CLineCounter.exe文件。UPX是个通用的可执行文件压缩器,具有免费、压缩率高(效果优于zip/gzip)、解压速度快、支持多种可执行文件格式等优点,是压缩可执行文件时的首选工具。

  UPX以控制台命令行方式操作,可通过-h选项查看详细帮助。压缩命令如下:

  E:\PyTest>upx -9 -f CLineCounter_exe\CLineCounter.exe #或

  E:\PyTest>upx -9 -f CLineCounter_exe\CLineCounter.exe -o CLC.exe

  前者会用压缩文件覆盖原文件,后者保留原文件而另外生成压缩文件(CLC.exe)。注意,-n(1~9)选项指示压缩模式,数值越大压缩率越高,但压缩和解压速度越慢(影响加载速度)。--best压缩率最高,速度也最慢,不建议用于大文件。

  作者使用UPX 3.91w版本,可将2.68M的CLineCounter.exe文件压缩至1.22M。经检验运行正常。

  以上内容为大家介绍了Python之制作exe,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注多测师。https://www.e70w.com/xwzx/


返回列表
在线客服
联系方式

热线电话

17727591462

上班时间

周一到周五

二维码
线