最近想把写的python代码打包,以供没用安装python环境的同事使用,需求如下:

  • 无python环境也可执行
  • 文件尽量少,不要太乱
  • 程序体积尽量小
  • 如果需要更新的话重复类库不用更新

采用方案如下:

  • 使用py2exe自动导入类库
  • 使用7-ZIP压缩library
  • upx压缩dll等文件
  • nsis生成安装文件
  • 采用md5验证的方式判别不用更新的类库

使用py2exe自动导入类库 
建立文件bin_setup.py

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. __author__ = 'lxd'
  4. from distutils.core import setup
  5. import py2exe
  6. import sys
  7. # If run without args, build executables, in quiet mode.
  8. if len(sys.argv) == 1:
  9. sys.argv.append("py2exe")
  10. sys.argv.append("-q")
  11. INCLUDES = []
  12. MANIFEST_TEMPLATE = """
  13. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  14. <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  15. <assemblyIdentity
  16. version="5.0.0.0"
  17. processorArchitecture="x86"
  18. name="%(prog)s"
  19. type="win32"
  20. />
  21. <description>%(prog)s</description>
  22. <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  23. <security>
  24. <requestedPrivileges>
  25. <requestedExecutionLevel
  26. level="asInvoker"
  27. uiAccess="false">
  28. </requestedExecutionLevel>
  29. </requestedPrivileges>
  30. </security>
  31. </trustInfo>
  32. <dependency>
  33. <dependentAssembly>
  34. <assemblyIdentity
  35. type="win32"
  36. name="Microsoft.VC90.CRT"
  37. version="9.0.21022.8"
  38. processorArchitecture="x86"
  39. publicKeyToken="1fc8b3b9a1e18e3b">
  40. </assemblyIdentity>
  41. </dependentAssembly>
  42. </dependency>
  43. <dependency>
  44. <dependentAssembly>
  45. <assemblyIdentity
  46. type="win32"
  47. name="Microsoft.Windows.Common-Controls"
  48. version="6.0.0.0"
  49. processorArchitecture="X86"
  50. publicKeyToken="6595b64144ccf1df"
  51. language="*"
  52. />
  53. </dependentAssembly>
  54. </dependency>
  55. </assembly>
  56. """
  57. RT_MANIFEST = 24
  58. options = {"py2exe" :
  59. {"compressed" : 1,
  60. "optimize" : 2,
  61. "bundle_files" : 2,
  62. "includes" : INCLUDES,
  63. "excludes" : ["Tkinter",],
  64. "dll_excludes": [ "MSVCP90.dll", "mswsock.dll", "powrprof.dll"] }}
  65. windows = [{"script": "bin.py",
  66. "icon_resources": [(1, "bin.ico")],
  67. "other_resources" : [(RT_MANIFEST, 1,
  68. MANIFEST_TEMPLATE % dict(prog="MyAppName"))],
  69. }]
  70. setup(name = "MyApp",
  71. version = "1.0",
  72. description = "Description of the app",
  73. author = "Author Name",
  74. author_email ="author@project.com",
  75. maintainer = "Maintainer Name",
  76. maintainer_email = "you@project.com",
  77. license = "wxWindows Licence",
  78. url = "http://projecthomepage.com",
  79. data_files = ["MSVCR90.dll", "gdiplus.dll"],
  80. #data_files=[("img",[r"d:\test\1.gif",r"d:\test\2.gif"]),("xml",[r"d:\test\1.xml",r"d:\test\2.xml"])])
  81. #zipfile=None,
  82. options = options,
  83. windows = windows,
  84. )

使用7-ZIP压缩library,使用upx压缩dll等文件 
建立脚本bin.cmd

  1. @echo off
  2. ::Set personal Path to the Apps:
  3. set PythonEXE=D:\Python26\python.exe
  4. set SevenZipEXE="D:\Program Files\7-ZIP\7z.exe"
  5. set UpxEXE="D:\Program Files\upx\upx.exe"
  6. :: Compress=1 - Use CompressFiles
  7. :: Compress=0 - Don't CompressFiles
  8. set Compress=1
  9. if not exist %~dpn0.py          call :FileNotFound %~dpn0.py
  10. if not exist %PythonEXE%        call :FileNotFound %PythonEXE%
  11. if not exist %SevenZipEXE%      call :FileNotFound %SevenZipEXE%
  12. if not exist %UpxEXE%           call :FileNotFound %UpxEXE%
  13. ::Compile the Python-Script
  14. %PythonEXE% "%~dpn0_setup.py" py2exe
  15. if not "%errorlevel%"=="0" (
  16. echo Py2EXE Error!
  17. pause
  18. goto:eof
  19. )
  20. :: Copy the Py2EXE Results to the SubDirectory and Clean Py2EXE-Results
  21. rd build /s /q
  22. xcopy dist\*.* "%~dpn0_EXE\" /d /y
  23. :: I use xcopy dist\*.* "%~dpn0_EXE\" /s /d /y
  24. :: This is necessary when you have subdirectories - like when you use Tkinter
  25. rd dist /s /q
  26. if "%Compress%"=="1" call:CompressFiles
  27. echo.
  28. echo.
  29. echo Done: "%~dpn0_EXE\"
  30. echo.
  31. pause
  32. goto:eof
  33. :CompressFiles
  34. %SevenZipEXE% -aoa x "%~dpn0_EXE\library.zip" -o"%~dpn0_EXE\library\"
  35. del "%~dpn0_EXE\library.zip"
  36. cd %~dpn0_EXE\library\
  37. %SevenZipEXE% a -tzip -mx9 "..\library.zip" -r
  38. cd..
  39. rd "%~dpn0_EXE\library" /s /q
  40. cd %~dpn0_EXE\
  41. %UpxEXE% --best *.*
  42. goto:eof
  43. :FileNotFound
  44. echo.
  45. echo Error, File not found:
  46. echo [%1]
  47. echo.
  48. echo Check Path in %~nx0???
  49. echo.
  50. pause
  51. exit
  52. goto:eof

使用方法: 
直接运行bin.cmd,程序会自动调用bin_setup.py来查找需要的类库,然后对类库文件进行压缩,生成的可执行文件在bin_EXE里。 
问题: 
我在打包的时候,出现错误“ImportError: MemoryLoadLibrary failed loading win32api.pyd”,用depends.exe查看其引用,然后多方搜索得知,其原因是py2exe错误的加载了mswsock.dll,powrprof.dll这两个文件,因此将它们排除即可。

  1. "dll_excludes": [ "MSVCP90.dll", "mswsock.dll", "powrprof.dll"] }}

nsis生成安装文件 
待续。。。 

java打包python到exe文件的更多相关文章

  1. 打包python到exe

    #!/usr/bin/python # -*- coding:utf-8 -*- import distutils import py2exe from distutils.core import s ...

  2. 用py2exe打包成一个exe文件

    用py2exe打包成一个exe文件 http://blog.csdn.net/franktan2010/article/details/46514607

  3. Python不同版本打包程序为.exe文件

    安装pyinstaller 测试用的python环境是3.6.2版本 下载地址 https://github.com/pyinstaller/pyinstaller/ 1.打开cmd,切到pyinst ...

  4. 【python】python打包生成的exe文件运行时提示缺少模块

    事情是这样的我用打包命令:pyinstaller -F E:\python\clpicdownload\mypython.py打包了一个exe程序,但是运行时提示我缺 少bs4模块然后我就去查pyin ...

  5. windows文本转语音 通过java 调用python 生成exe可执行文件一条龙

    我已记不清 我失败过多少次 ,找过多少资料 ,但是功夫不负有心人 ,还是成功了. 所有资料和需要的语音模块的资料以放置在文章末尾, 有些是引用别人的博客的部分内容, 原文是在有道云笔记,所以没有图,请 ...

  6. 如何将Debug文件夹下的资源打包成一个EXE文件直接执行

    前言:前段时间写了个小程序,想分享给好友看看,可所以资源都放在Debug文件夹下,整个文件夹发给人家这也太……,为了显得稍微专业一点,想把它们打包一个EXE文件执行,因为我见到到这样的程序,直接一个E ...

  7. pyinstaller 打包生成的exe文件,在其他电脑上报错

    解决方法: 1.第一种情况,在打包的时候不要加参数-w,看一下执行exe文件后出现的报错再看下一步的行动 2.应该是需要装一个VC 2015 x64(下载地址:https://www.microsof ...

  8. 三个方法生成python的exe文件

    背景:用的python3.8 方法一:用cmd 输入[pip3 install pyinstaller] 上一条指令报错 事实上,在python3.8版本时,输入pip也会显示是无法支持的语句,需要用 ...

  9. Pyinstaller 打包python 到exe 在windows下免python环境运行python

    在创建了独立应用(自包含该应用的依赖包)之后,还可以使用 PyInstaller 将 Python 程序生成可直接运行的程序,这个程序就可以被分发到对应的 Windows 或 Mac OS X 平台上 ...

随机推荐

  1. 数据预处理之数据规约(Data Reduction)

    数据归约策略 数据仓库中往往具有海量的数据,在其上进行数据分析与挖掘需要很长的时间 数据归约 用于从源数据中得到数据集的归约表示,它小的很多,但可以产生相同的(几乎相同的)效果 数据归约策略 维归约  ...

  2. 【贪心】bzoj1577: [Usaco2009 Feb]庙会捷运Fair Shuttle

    一类经典的线段贪心 Description 公交车一共经过N(1<=N<=20000)个站点,从站点1一直驶到站点N.K(1<=K<=50000)群奶牛希望搭乘这辆公交车.第i ...

  3. Windows10 关闭自动更新

    win+R调出运行窗口: 输入services.msc,查找 跳出服务窗口,点击windows update设置禁用即可 Windows Update Medic Service没办法禁用,需要采用其 ...

  4. zookeeper伪集群(一)

    Zookeeper的安装和配置十分简单, 既可以配置成单机模式, 也可以配置成伪集群模式.集群模式. 本人将对伪集群.集群进行重点介绍: 铺垫: 1.集群必须是奇数(2N+1),伪集群和集群一致. 2 ...

  5. graph-Dijkstra's shortest-path alogorithm

    直接贴代码吧,简明易懂. 后面自己写了测试,输入数据为: a b c d e 0 1 4 0 2 2 1 2 3 1 3 2 1 4 3 2 1 1 2 3 4 2 4 5 4 3 1 也就是课本上1 ...

  6. 针对NM_CUSTOMDRAW消息的学习

    消息的形式:1 窗口消息,2 命令消息,3 WM_NOTIFY消息,4 自定义消息 我们的NM_CUSTOMDRAW消息就是就属于第三种WM_NOTIFY消息,而添加消息映射的方法分为两种: BEGI ...

  7. C++实现Behavioral - Observer模式 (转)

    转http://patmusing.blog.163.com/blog/static/13583496020101501923571/ 也称为Dependents或Publish-Subscribe模 ...

  8. LA 6538 Dinner Coming Soon DP

    题意: 给出一个有\(N\)个顶点\(M\)条有向边的图,起点为\(1\),终点为\(N\). 每条边有经过的时间,和经过这条边的花费.一开始你有\(R\)元钱,要在\(T\)时间内赶到终点去约会. ...

  9. POJ 3469 最小割 Dual Core CPU

    题意: 一个双核CPU上运行N个模块,每个模块在两个核上运行的费用分别为Ai和Bi. 同时,有M对模块需要进行数据交换,如果这两个模块不在同一个核上运行需要额外花费. 求运行N个模块的最小费用. 分析 ...

  10. 取出列表中第N大的数

    array=list(range(10)) random.shuffle(array) print(array) def func1(array,n): d,k={},n while k>0: ...