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开发(176):导出所有接口供使用

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

[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.角度…

php框架 wc if_PHP if else语句

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

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

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

iOS - 判断用户是否允许推送通知(iOS7/iOS8)

&#xff08;iOS8中用户开启的推送通知类型对应的是UIUserNotificationType&#xff08;下边代码中UIUserNotificationSettings的types属性的类型&#xff09;&#xff0c;iOS7对应的是UIRemoteNotificationType&#xff09; 此处以iOS8的UIUserNotificationType为例&#xff0…

第一课 PE格式

From: http://bbs.pediy.com/showpost.php?p138590&postcount2 要想学脱壳&#xff0c;第一步就得掌握PE格式&#xff0c;PE是Portable Executable File Format&#xff08;可移植的执行体&#xff09;简写&#xff0c;它是目前Windows平台上的主流可执行文件格式。 Micr…

React开发(182):ant design table中 带线框的列表

ReactDOM.render(<Tablecolumns{columns}dataSource{data}borderedtitle{() > Header}footer{() > Footer}/>,mountNode, );

Linux DHCP Server 配置给FIT AP 使用的option

Linux DHCP Server 配置给FIT AP 使用的option 2010-09-17 09:45:52标签&#xff1a;Linux DHCP Server option FIT    [推送到技术圈] 版权声明&#xff1a;原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将…

Claims 认证详解(1)

很多时候&#xff0c;我们进行应用程序之间的交互。比如&#xff0c;一个员工登录了门户网站后&#xff0c;需要访问进销存系统、CRM系统&#xff0c;如果不进行特殊处理&#xff0c;就需要多次输入用户名和密码。用过SharePoint的朋友&#xff0c;可能知道有个“单点登录”的东…

php什么设置前端代码,代码编辑器与PHPSTUDY的安装与配置过程(前端第一课)

前端第一课&#xff1a;编辑器与PHPSTUDY的安装与配置过程编辑器安装过程1.Visual Studio Code 官网下载软件&#xff0c;解压下载文件&#xff0c;打开安装程序安装至你的计算机。2.安装“Chinese(Simplified)Language Pack for Visual Studio Code” 插件&#xff0c;并重启v…

重学java基础第二十课:环境配置和第一个helloWorld

大家好 我是歌谣 闲来无事做 不如敲代码 今天大概说如何编译一个简单的helloWorld小案例 安装环境的配置 1首先进入jdk的官网 找到对应的jdk版本 这边一window为例 2接下来--右键--计算机--属性--进行高级系统设置 3在用户变量里面配置 JAVA_HOME:G:\java CLASSPATH:.;%JAV…

vim QuickFix 窗口

From: http://hi.baidu.com/bali5/blog/item/82f87c0ab670a136b0351d4f.html 在上一节的图10中大家可以看到在窗口下面有一个显示查询结果的窗口, 这个窗口中列出了查询命令的查询结果, 用户可以从这个窗口中选择每个结果进行查看, 这个窗口叫"QuickFix"窗口, 以前也…

谷歌笔试题(Google十二岁生日晚)

2010-9-27日是Google十二岁生日&#xff0c;就在生日当天&#xff0c;Google进行了一场宣讲会加笔试。Google果然不一般&#xff0c;宣讲会门外都站满了人&#xff0c;也可见竞争之激烈&#xff0c;据说只需要40个人参加面试&#xff0c;而笔试的人有1000之多&#xff0c;汗………

RHE5服务器配置——Samba服务器

Samba的核心 Samba的核心是两个守护进程&#xff0c;即smbd和nmbd。服务器启动到停止期间持续运行&#xff0c;smba监听139TCP端口&#xff1b;nmbd监听137和 138UDP端口。smbd和nmbd使用的全部配置信息保存在smb.conf文件中&#xff0c;smb.conf向smbd和nmbd两个守护进程说明输…

PHP检查微信域名屏蔽接口,微信域名检测API接口,实时查询域名是否被微信拦截...

微信域名检测API接口的应用场景&#xff1a;由于微信对外部链接内容规范比较严格&#xff0c;所以可能一不小心就会被判定为是违反内容规范的&#xff0c;或被同行恶意举报投诉之类的。那么此时就要用到微信域名检测接口&#xff0c;实时检测域名的状态&#xff0c;实时查询域名…

NGINX + TOMCAT7 + MEMCACHED 实现SESSION 共享

原文地址&#xff1a; http://my.oschina.net/u/1791256/blog/283064 TOMCAT7.0 NGINX MEMCACHED memcached-session-manager 实现SESSION共享 http://blog.csdn.net/nerissa/article/details/18961361 ; //参考博客 http://pan.baidu.com/s/1pJlZ0mB //相关包下载&#…