logo资料库

如何封装一个带传参的python程序成可执行文件.pdf

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
如何封装一个带传参的python程序成可执行文件 1. 一个需要传参的python程序 1. 一个需要传参的python程序 简单点的方法, 用sys.argv import sys ... path = sys.argv[1] img1 = sys.argv[2] img2 = sys.argv[3] matchSift(path, img1, img2) 2. 把python程序封装起来(-> .exe) 2. 把python程序封装起来(-> .exe) http://www.cnblogs.com/mywolrd/p/4756005.html 各种打包工具的对比如下 各种打包工具的对比如下(来自文章Freezing Your Code): Soluti on Windo ws Linux OS X Pytho n 3 Licens e One-fi le mo de Zipfile import Eggs bbFree ze yes py2exe yes pyInst aller cx_Fre eze py2ap p yes yes no yes no yes yes no yes no yes yes yes no yes no yes yes MIT MIT GPL PSF MIT no yes yes no no yes yes no yes yes yes no yes yes yes pkg_r esour ces su pport yes no no no yes PS.其中pyInstaller和cx_Freeze都是不错的,stackoverflow上也有人建议用cx_Freeze,说是更便捷些。 pkg_resources新版的pyInstaller貌似是支持的。 安装PyInstaller 安装PyInstaller 对于那些网络比较稳定,能够流畅使用pip源地址的用户,直接下面的命令就可以搞定: pip install pyinstaller (下安装包安装的就不说了, 百度一下就行, 没多大, 在线安ok) 安装完后,检查安装成功与否: pyinstaller --version 安装成功后,就可以使用下面的命令了: pyinstaller : 打包可执行文件的主要命令,详细用法下面会介绍。 pyi-archive_viewer : 查看可执行包里面的文件列表。 pyi-bindepend : 查看可执行文件依赖的动态库(.so或.dll文件) pyi-... : 等等。 使用PyInstaller 使用PyInstaller 最简单的用法,在和myscript.py同目录下执行命令:
pyinstaller mycript.py 然后会看到新增加了两个目录build和dist,dist下面的文件就是可以发布的可执行文件,对于上面的命令你会发现 dist目录下面有一堆文件,各种都动态库文件和myscrip可执行文件。有时这样感觉比较麻烦,需要打包dist下面的 所有东西才能发布,万一丢掉一个动态库就无法运行了,好在pyInstaller支持单文件模式,只需要执行: pyinstaller -F mycript.py 你会发现dist下面只有一个可执行文件,这个单文件就可以发布了,可以运行在你正在使用的操作系统类似的系统 的下面。 当然,pyinstaller还有各种选项,有通用选项,如-d选项用于debug,了解pyInstaller执行的过程;还有一些针对 不同平台的选项,具体用法可以访问PyInstaller官方WIKI。 在执行pyInstaller命令的时候,会在和脚本相同目录下,生成一个.spec文件,该文件会告诉pyinstaller如何处理 你的所有脚本,同时包含了命令选项。一般我们不用去理会这个文件,若需要打包数据文件,或者给打包的二进制 增加一些Python的运行时选项时...一些高级打包选项时,需要手动编辑.spec文件。可以使用: pyi-makespec options script [script ...] 创建一个.spec文件,对于手动编辑的.spec文件,我们可以使用下面任意一条命令: pyinstaller specfile pyi-build specfile 关于spec, 多说两句 关于spec, 多说两句 执行该命令后将在当前目录下生成build和dist文件夹,另外还会生成一个wgClient.spec文件,用于描述pyinstall的打包过 程,如果对打包有特殊要求时,可以直接编辑spec文件,然后将spec文件作为打包时的输入对象: 1. C:\Python27\python.exe C:\pyinstaller-2.0\pyinstaller.py wgClient.spec spec文件 下面附上一段spec文件的示例代码,结合示例说明一些打包过程中的一些特殊要求: 1. # -*- mode: python -*- 2. a = Analysis(['src\\wgClient.py'], 3. pathex=['D:\\PycharmProjects\\wgClientPy'], 4. hiddenimports=[], 5. hookspath=None) 6. pyz = PYZ(a.pure) 7. exe = EXE(pyz, 8. a.scripts, 9. a.binaries, 10. a.zipfiles, 11. a.datas, 12. [('logging.conf', 'src/logging.conf', 'DATA')], 13. [('clr.pyd', 'C:\\Python27\DLLs\\clr.pyd', 'EXTENSION'), 14. ('Python.Runtime.dll', 'C:\\Python27\DLLs\\Python.Runtime.dll', 'BINARY'), 15. ('Python.Runtime.pdb', 'C:\\Python27\DLLs\\Python.Runtime.pdb', 'BINARY'), 16. ('n3kAdrtB.dll', 'src\\n3kAdrtB.dll', 'BINARY') ],
17. name=os.path.join('build\\pyi.win32\\wgClient', 'wgClient.exe'), 18. debug=False, 19. strip=None, 20. upx=True, 21. console=True ) 22. coll = COLLECT(exe, 23. [('config.ini', 'src/config.ini', 'DATA')], 24. strip=None, 25. upx=True, 26. name='dist') 上面的Analysis、PYZ、EXE、COLLECT都是事先定义的子任务。 Analysis 用于定义python源文件,包括搜索路径,源文件名称等。Analysis有5个输出项,可供其他子任务引用: scripts:在Analysis中定义的源文件 pure:python模块 binaries:动态库 datas:数据文件,可以是任意文件类型,例如ini配置文件、字体文件、图片等 zipfiles:zip格式的依赖文件,一般是egg格式的库文件 PYZ 将python文件压缩打包,输入一般是Analysis.pure. EXE 打包生成exe文件,从上面的例子中可以看出,EXE子任务包含了Analysis的所有5个输出项(pure被PYZ打包了), 另外还包含程序运行所需的一些配置文件和动态库,这些不在Analysis输出项中的文件是通过TOC格式来配置 的,TOC(Table Of Contents),TPC其实就是一个tuple,格式为(name, path, typecode),其中typecode可以 为以下值: EXTENSION:python的扩展库 PYSOURCE:python脚本 PYMODULE:A pure Python module (including __init__modules). PYZ:A .pyz archive (archive_rt.ZlibArchive) PKG:A pkg archive (carchive4.CArchive) BINARY:动态库 DATA:数据文件 OPTION:A runtime runtime option (frozen into theexecutable). COLLECT 用来构建最终的生成目录,可以复制其他子任务生成的结果,并拷贝到指定目录,形成最终的打包结果。 示例中的spec文件,会在dist目录下生成一个wgClient.exe的可以执行文件,里面包含所有的依赖项,可以独立运 行,同时该目录下还有config.ini配置文件。 文件路径 文件路径 上例中,将logging.conf文件直接打包在exe内部了,python在读取时应使用以下方式读取文件路径: 1. if getattr(sys, 'frozen', None): 2. basedir = sys._MEIPASS 3. else: 4. basedir = os.path.dirname(__file__) 5. logging.config.fileConfig(os.path.join(basedir, 'logging.conf'))
具体怎么用spec来方便关联程序依赖的文件, 可参考 http://jingyan.baidu.com/article/b2c186c8d9856dc46ff6ff54.html http://jingyan.baidu.com/article/63f2362827511d0209ab3d51.html 这点要注意, 因为py程序执行的目录和exe执行的目录是不用的 如果依赖当前目录的文件, 要么就自己copy到exe目录下, 要么就修改Spec, 让程序自动copy过去 PyInstaller原理简单介绍 PyInstaller原理简单介绍 PyInstaller其实就是把python解析器和你自己的脚本打包成一个可执行的文件,和编译成真正的机器码完全是 两回事,所以千万不要指望成打包成一个可执行文件会提高运行效率,相反可能会降低运行效率,好处就是在运行 者的机器上不用安装python和你的脚本依赖的库。在Linux操作系统下,它主要用的binutil工具包里面的ldd和 objdump命令。 PyInstaller输入你指定的的脚本,首先分析脚本所依赖的其他脚本,然后去查找,复制,把所有相关的脚本收集起 来,包括Python解析器,然后把这些文件放在一个目录下,或者打包进一个可执行文件里面。 可以直接发布输出的整个文件夹里面的文件,或者生成的可执行文件。你只需要告诉用户,你的应用App是自我包含 的,不需要安装其他包,或某个版本的Python,就可以直接运行了。 需要注意的是,PyInstaller打包的执行文件,只能在和打包机器系统同样的环境下。也就是说,不具备可移植性, 若需要在不同系统上运行,就必须针对该平台进行打包。 3. 打包“随机取子图像(反例)”时出现的问题总结 3. 打包“随机取子图像(反例)”时出现的问题总结 ① python打包exe问题 之前已经试过打包python程序成为一个exe文件了, 可以直接拿出去用(参考笔记中的“如何封装一个带传参的 python程序成可执行文件”), 但这次在打包exe的时候碰到了一个新的问题 maximum recursion depth exceeded while calling a Python object maximum recursion depth exceeded while calling a Python object 这个问题的解决是在生成的spec最上面加上一句 import sys sys.setrecursionlimit(5000) 人为提高递归深度的限制, 然后在cmd中运行 pyinstaller ***.spec, 就会按照改过的spec去执行打包程序 https://stackoverflow.com/questions/38977929/pyinstaller-creating-exe-runtimeerror-maximum-recursion- depth-exceeded-while-ca spec的示例 # -*- mode: python -*- import sys sys.setrecursionlimit(5000) block_cipher = None a = Analysis(['bce.py'], pathex=['E:\\01_work\\01_Routine_Inspect\\04_python\\batch_counter_example'],
binaries=[], datas=[], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, name='bce', debug=False, strip=False, upx=True, console=True ) ② 打包exe时的流程 ② 打包exe时的流程 因为打包exe还是比较慢, 所以最好是经过了以下步骤后, 再去打包, 成功率有保证 ①跑python程序, 传参写死, 执行是否ok ②在cmd上运行pyhon程序, 传参写入, 执行是否ok(python bce.py ./test_data ./out_data 200 10) 还有一点, 注意传参都是str进去的, 如果要用数字, 记得int(input)改一下
分享到:
收藏