java打包python到exe文件
- 无python环境也可执行
- 文件尽量少,不要太乱
- 程序体积尽量小
- 如果需要更新的话重复类库不用更新
采用方案如下:
- 使用py2exe自动导入类库
- 使用7-ZIP压缩library
- upx压缩dll等文件
- nsis生成安装文件
- 采用md5验证的方式判别不用更新的类库
使用py2exe自动导入类库
建立文件bin_setup.py
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- __author__ = 'lxd'
- from distutils.core import setup
- import py2exe
- import sys
- # If run without args, build executables, in quiet mode.
- if len(sys.argv) == 1:
- sys.argv.append("py2exe")
- sys.argv.append("-q")
- INCLUDES = []
- MANIFEST_TEMPLATE = """
- <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
- <assemblyIdentity
- version="5.0.0.0"
- processorArchitecture="x86"
- name="%(prog)s"
- type="win32"
- />
- <description>%(prog)s</description>
- <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
- <security>
- <requestedPrivileges>
- <requestedExecutionLevel
- level="asInvoker"
- uiAccess="false">
- </requestedExecutionLevel>
- </requestedPrivileges>
- </security>
- </trustInfo>
- <dependency>
- <dependentAssembly>
- <assemblyIdentity
- type="win32"
- name="Microsoft.VC90.CRT"
- version="9.0.21022.8"
- processorArchitecture="x86"
- publicKeyToken="1fc8b3b9a1e18e3b">
- </assemblyIdentity>
- </dependentAssembly>
- </dependency>
- <dependency>
- <dependentAssembly>
- <assemblyIdentity
- type="win32"
- name="Microsoft.Windows.Common-Controls"
- version="6.0.0.0"
- processorArchitecture="X86"
- publicKeyToken="6595b64144ccf1df"
- language="*"
- />
- </dependentAssembly>
- </dependency>
- </assembly>
- """
- RT_MANIFEST = 24
- options = {"py2exe" :
- {"compressed" : 1,
- "optimize" : 2,
- "bundle_files" : 2,
- "includes" : INCLUDES,
- "excludes" : ["Tkinter",],
- "dll_excludes": [ "MSVCP90.dll", "mswsock.dll", "powrprof.dll"] }}
- windows = [{"script": "bin.py",
- "icon_resources": [(1, "bin.ico")],
- "other_resources" : [(RT_MANIFEST, 1,
- MANIFEST_TEMPLATE % dict(prog="MyAppName"))],
- }]
- setup(name = "MyApp",
- version = "1.0",
- description = "Description of the app",
- author = "Author Name",
- author_email ="author@project.com",
- maintainer = "Maintainer Name",
- maintainer_email = "you@project.com",
- license = "wxWindows Licence",
- url = "http://projecthomepage.com",
- data_files = ["MSVCR90.dll", "gdiplus.dll"],
- #data_files=[("img",[r"d:\test\1.gif",r"d:\test\2.gif"]),("xml",[r"d:\test\1.xml",r"d:\test\2.xml"])])
- #zipfile=None,
- options = options,
- windows = windows,
- )
使用7-ZIP压缩library,使用upx压缩dll等文件
建立脚本bin.cmd
- @echo off
- ::Set personal Path to the Apps:
- set PythonEXE=D:\Python26\python.exe
- set SevenZipEXE="D:\Program Files\7-ZIP\7z.exe"
- set UpxEXE="D:\Program Files\upx\upx.exe"
- :: Compress=1 - Use CompressFiles
- :: Compress=0 - Don't CompressFiles
- set Compress=1
- if not exist %~dpn0.py call :FileNotFound %~dpn0.py
- if not exist %PythonEXE% call :FileNotFound %PythonEXE%
- if not exist %SevenZipEXE% call :FileNotFound %SevenZipEXE%
- if not exist %UpxEXE% call :FileNotFound %UpxEXE%
- ::Compile the Python-Script
- %PythonEXE% "%~dpn0_setup.py" py2exe
- if not "%errorlevel%"=="0" (
- echo Py2EXE Error!
- pause
- goto:eof
- )
- :: Copy the Py2EXE Results to the SubDirectory and Clean Py2EXE-Results
- rd build /s /q
- xcopy dist\*.* "%~dpn0_EXE\" /d /y
- :: I use xcopy dist\*.* "%~dpn0_EXE\" /s /d /y
- :: This is necessary when you have subdirectories - like when you use Tkinter
- rd dist /s /q
- if "%Compress%"=="1" call:CompressFiles
- echo.
- echo.
- echo Done: "%~dpn0_EXE\"
- echo.
- pause
- goto:eof
- :CompressFiles
- %SevenZipEXE% -aoa x "%~dpn0_EXE\library.zip" -o"%~dpn0_EXE\library\"
- del "%~dpn0_EXE\library.zip"
- cd %~dpn0_EXE\library\
- %SevenZipEXE% a -tzip -mx9 "..\library.zip" -r
- cd..
- rd "%~dpn0_EXE\library" /s /q
- cd %~dpn0_EXE\
- %UpxEXE% --best *.*
- goto:eof
- :FileNotFound
- echo.
- echo Error, File not found:
- echo [%1]
- echo.
- echo Check Path in %~nx0???
- echo.
- pause
- exit
- goto:eof
使用方法:
直接运行bin.cmd,程序会自动调用bin_setup.py来查找需要的类库,然后对类库文件进行压缩,生成的可执行文件在bin_EXE里。
问题:
我在打包的时候,出现错误“ImportError: MemoryLoadLibrary failed loading win32api.pyd”,用depends.exe查看其引用,然后多方搜索得知,其原因是py2exe错误的加载了mswsock.dll,powrprof.dll这两个文件,因此将它们排除即可。
- "dll_excludes": [ "MSVCP90.dll", "mswsock.dll", "powrprof.dll"] }}
nsis生成安装文件
待续。。。
java打包python到exe文件的更多相关文章
- 打包python到exe
#!/usr/bin/python # -*- coding:utf-8 -*- import distutils import py2exe from distutils.core import s ...
- 用py2exe打包成一个exe文件
用py2exe打包成一个exe文件 http://blog.csdn.net/franktan2010/article/details/46514607
- Python不同版本打包程序为.exe文件
安装pyinstaller 测试用的python环境是3.6.2版本 下载地址 https://github.com/pyinstaller/pyinstaller/ 1.打开cmd,切到pyinst ...
- 【python】python打包生成的exe文件运行时提示缺少模块
事情是这样的我用打包命令:pyinstaller -F E:\python\clpicdownload\mypython.py打包了一个exe程序,但是运行时提示我缺 少bs4模块然后我就去查pyin ...
- windows文本转语音 通过java 调用python 生成exe可执行文件一条龙
我已记不清 我失败过多少次 ,找过多少资料 ,但是功夫不负有心人 ,还是成功了. 所有资料和需要的语音模块的资料以放置在文章末尾, 有些是引用别人的博客的部分内容, 原文是在有道云笔记,所以没有图,请 ...
- 如何将Debug文件夹下的资源打包成一个EXE文件直接执行
前言:前段时间写了个小程序,想分享给好友看看,可所以资源都放在Debug文件夹下,整个文件夹发给人家这也太……,为了显得稍微专业一点,想把它们打包一个EXE文件执行,因为我见到到这样的程序,直接一个E ...
- pyinstaller 打包生成的exe文件,在其他电脑上报错
解决方法: 1.第一种情况,在打包的时候不要加参数-w,看一下执行exe文件后出现的报错再看下一步的行动 2.应该是需要装一个VC 2015 x64(下载地址:https://www.microsof ...
- 三个方法生成python的exe文件
背景:用的python3.8 方法一:用cmd 输入[pip3 install pyinstaller] 上一条指令报错 事实上,在python3.8版本时,输入pip也会显示是无法支持的语句,需要用 ...
- Pyinstaller 打包python 到exe 在windows下免python环境运行python
在创建了独立应用(自包含该应用的依赖包)之后,还可以使用 PyInstaller 将 Python 程序生成可直接运行的程序,这个程序就可以被分发到对应的 Windows 或 Mac OS X 平台上 ...
随机推荐
- How To Add Swap Space on Ubuntu 16.04
Introduction One of the easiest way of increasing the responsiveness of your server and guarding aga ...
- destoon 信息发布表单提交验证
sell 模块的form表单如下: <form method="post" id="dform" action="?" target= ...
- yield关键字有什么作用
所属网站分类: python基础 > 语句 作者:goodbody 链接: http://www.pythonheidong.com/blog/article/10/ 来源:python黑洞网 ...
- python3中urllib库的request模块详解
刚刚接触爬虫,基础的东西得时时回顾才行,这么全面的帖子无论如何也得厚着脸皮转过来啊! 原帖地址:https://www.2cto.com/kf/201801/714859.html 什么是 Urlli ...
- nrf52裸机学习——GPIO操作
/** * @brief Function for writing a value to a GPIO pin. * * Note that the pin must be configured as ...
- delphi xe7 多线程调用CMD,使用管道,临界区技术,实现指定用户名,多线程,异步返回CMD命令结果到memo
第一次发这个,发现格式很乱,不好看,可以用XE7的project--format project sources命令格式化一下代码. 后面我会上传此次修改函数用的源代码到云盘 链接: http://p ...
- bzoj3172 luogu3966 [TJOI2013]单词
蒟蒻也能写出来的AC代码!这题是AC自动机模板题.插入单词时用一个没出现过的字符隔开就行了. 一些细节请看注释 #include <iostream> #include <cstri ...
- [转载]ExtJs4 笔记(2) ExtJs对js基本语法扩展支持
作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/) 本篇主要介绍一下ExtJs对JS基本语法的扩展支持,包括动态加载.类的封装等. 一.动态引 ...
- Leetcode23--->Merge K sorted Lists(合并k个排序的单链表)
题目: 合并k个排序将k个已排序的链表合并为一个排好序的链表,并分析其时间复杂度 . 解题思路: 类似于归并排序的思想,lists中存放的是多个单链表,将lists的头和尾两个链表合并,放在头,头向后 ...
- 大数据学习——scala的wordCount小例子
val lines=List("hello tom hello jerry","hello tom hello kitty hello china") //方法 ...