java打包python到exe文件

最近想把写的python代码打包,以供没用安装python环境的同事使用,需求如下: 
  • 无python环境也可执行
  • 文件尽量少,不要太乱
  • 程序体积尽量小
  • 如果需要更新的话重复类库不用更新

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


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

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

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

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

 

转载于:https://www.cnblogs.com/jefree/p/4461836.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React开发(173):ant design设置额外的展开行

expandedRowRender额外的展开行Function(record, index, indent, expanded):ReactNode

fail2ban封IP之Http

环境介绍&#xff1a;http是一个tomcat 的js程序 &#xff0c;设置的路径为/opt/tomcat5/logs/localhost_access_log.txt OS:centos 5.3 fail2ban版本:fail2ban-0.8.2-3.el5.rf.noarch.rpm 官方网站&#xff1a;http://www.fail2ban.org/wiki/index.php/Main_Page 背景&…

[Linux] VIM 代码折叠

From: http://www.cnblogs.com/abeen/archive/2010/08/06/1794197.html VIM 代码折叠 VIM代码折叠方式可以用"foldmethod"选项来设置&#xff0c;如: set foldmethodindent 有6种方式来折叠代码 1. manual //手工定义折叠 2. indent //用缩进表示折叠 3. expr  //…

linux time

time&#xff08;取得目前的时间&#xff09; 相关函数ctime&#xff0c;ftime&#xff0c;gettimeofday 表头文件#include<time.h> 定义函数time_t time(time_t *t); 函数说明此函数会返回从公元1970年1月1日的UTC时间从0时0分0秒算起到现在所经过的秒数。如果t 并非…

java 模拟登陆web系统_关于java模拟登陆WEB的问题。

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.HttpURLConnection;import java.net.URL;import javax.swing.JOptionPane;/** …

React开发(176):导出所有接口供使用

export * from ‘./order’; export * from ‘./wallet’; export * from ‘./walletAccount’; export * from ‘./walletTrade’;

微软Windows Mobile智能手机GPRS上网设置教程(转)

总是不断的有用户咨询GPRS的设置方法。并且由于中国移动的原因&#xff0c;人为的将一个GPRS网搞成了两个接入&#xff1a;CMNET和CMWAP&#xff0c;因此带来的问题更是多多。在昨日一个用户被移动强盗般的扣取了100多元的网络费后促使了这篇文章的加速出炉。之所以推荐新手必看…

[vim] vim中使用cscope的安装与使用

From: http://blog.sina.com.cn/s/blog_498a6eeb0100v05m.html 1. 下载cscope-15.7 http://dldx.csdn.net/fd.php?i878111800792509&s924cf0d6a0f63bb6ca24f900 ba3fcad8解压所里面有三个文件&#xff0c; 放到vim的安装目录下即可。2.建索引-bBuild the cross-reference…

Sql Server函数全解二数学函数

阅读目录 1.绝对值函数ABS(x)和返回圆周率的函数PI()2.平方根函数SQRT(x)3.获取随机函数的函数RAND()和RAND(x)4.四舍五入函数ROUND(x,y)5.符号函数SIGN(x)6.获取整数的函数CEILING(x)和FLOOR(x)7.幂运算函数POWER(x,y)、SQUARE(x)、和EXP(x)8.对数的运算LOG(x)和LOG10(x)9.角度…

java 虚类private 继承_Java经典面试36题和答案

1.”static”关键字是什么意思&#xff1f;Java中是否可以覆盖(override)一个private或者是static的方法&#xff1f;“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。Java中static方法不能被覆盖&#xff0c;因为方法覆盖是基于运…

React开发(177):opentab没有menu会报错

import { openTab } from /utils/tabUtils; connect(({ turnover, menu }) > ({turnover,menu, }))

Silverlight - IIS 7.5 部署SilverLight4网站以及问题解决

http://www.silverlightchina.net/html/tips/2010/0216/723.html 安装设置 Windows 7 IIS (HTTP Error 500.21 - Internal Server Error)解决 原因&#xff1a;在安装Framework v4.0之后&#xff0c;再启用IIS&#xff0c;导致Framework没有完全安装 解决&#xff1a;开始->…

[vim]vim 插件汇总

From: http://blog.sina.com.cn/s/blog_498a6eeb0100v06k.html 1. NERD_commenter.vim 万能的注释插件。 可以根据增加或修改&#xff0c;非常方便。 2. ctags 和cscope 用来看代码的一个工具&#xff0c;和cscope配合使用更好。 3.TagList 插件 高效地浏览源码, 出了当前文件…

php框架 wc if_PHP if else语句

无论在何种编程语言中&#xff0c;流程控制都是很重要的内容。由于 PHP 的大部分语法都继承了C语言的特点&#xff0c;因此在流程控制方面&#xff0c;PHP 有着和C语言类似的流程控制。if else 语句是流程控制中根据条件判断执行的一种。该语句执行时先对条件进行判断&#xff…

React开发(178):ant design table基础用法

<Table columns{columns} dataSource{data} /> ant design重要的控制表头和数据的对象属性 columns data

c# 泛型List的定义、作用、用法

定义&#xff1a;List<T>类表示可通过索引访问的对象的强类型列表&#xff0c;提供用于对列表进行搜索、排序和操作的方法。 作用&#xff1a; 泛型最常见的用途是泛型集合 我们在创建列表类时&#xff0c;列表项的数据类型可能是int,string或其它类型&#xff0c;如果对…

[vim]在vim中格式化xml

From: http://blog.sina.com.cn/s/blog_498a6eeb0100v3km.html 在_vimrc中增加&#xff1a; " 格式化xml function Xml() set filetypexml :%s/></>\r</g"把><替换成>回车< :normal ggG endfunction map <leader>xml :ca…

怎样用php写入数据库表,PHP如何将数据写入到MYSQL数据库

要想通过PHP将数据写入到MYSQL数据库&#xff0c;基本上要经历三步骤&#xff1a;连接数据库将数据写入数据库关闭连接连接数据库代码&#xff1a;define("DB_HOST","localhost");define("DB_USER","root");define("DB_PWD"…

无线路由与无线AP有什么不同

无线路由与无线AP有什么不同 无线网络从07年开始就进入高速发展的时期&#xff0c;无论是企业还是家庭&#xff0c;在组建网络的时候&#xff0c;大部分都会选择架设无线网络。但是无线网络因为其多种协议、多种功能&#xff0c;产品之间也会有不小的差别&#xff0c;就像很多人…

VIM 参考手册

From: http://vimcdoc.sourceforge.net/doc/map.html *map.txt* For Vim version 7.3. 最后更新: 2011年5月VIM 参考手册 作者: Bram Moolenaar译者: con<connetease.com>http://vimcdoc.sf.net键映射、缩写和用户定义的命令。本主题在用户手册 |05.3|&#x…