之前写了一个小工具,将excel配置表转换为json、xml、lua等配置文件。最近在学习egret,正好需要转换配置文件,刚好就用上了。然而当我想把工具拷到工作目录时,就发愁了。之前我为了方便扩展,把程序拆分得太细:

xzc@xzc-HP-ProBook-4446s:~/Documents/code/github/py_exceltools$ ls -lh
总用量 80K
drwxrwxr-x xzc xzc .0K 7月 : bin
drwxrwxr-x xzc xzc .0K 7月 : client
-rw-rw-r-- xzc xzc .7K 7月 : decoder.py
-rw-rw-r-- xzc xzc 7月 : error.py
-rw-rw-r-- xzc xzc 16K 7月 : example.xlsx
-rw-rw-r-- xzc xzc 7月 : lancher.bat
-rw-rw-r-- xzc xzc 7月 : lancher.sh
-rw-rw-r-- xzc xzc .9K 7月 : loader.py
-rw-rw-r-- xzc xzc 7月 : loader.spec
-rw-rw-r-- xzc xzc .4K 7月 : README.md
drwxrwxr-x xzc xzc .0K 7月 : server
-rw-rw-r-- xzc xzc .0K 7月 : writer_json.py
-rw-rw-r-- xzc xzc .2K 7月 : writer_lua.py
-rw-rw-r-- xzc xzc .6K 7月 : writer_xml.py

如此多的文件,放到工作目录不太好组织,也容易与项目的源代码混在一起。毕竟我用的vs code分不清哪些才是工程内文件。何况以后还要给策划用,还得装python和openpyxl库,部署比较麻烦。于是想尝试一下把python脚本打包为一个exe文件。

  google了一下,常用的工具不外乎pyinstaller和py2exe。两者的功能都差不多,但是发现pyinstaller有一个参数 --onefile,即脚本都打包成单个可运行文件,这不正是我要的么。于是下载安装来尝试一下:

py_exceltools$pip install pyinstaller
py_exceltools$pyinstaller -F loader.py ...
tuple index out of range

安装过程很顺利,但是打包时却报了个错("tuple index out of range")。google一下"pyinstaller tuple index out of range",在github中发现是pyinstaller3.2.1不兼容python3.6.1。但是看看issue的回复,在dev版本是修复了。于是想试一下开发版本,不过看了一眼README,发现OS X、Linux、Win三个平台的CI都是failing:

想想还是算了吧,免得折腾半天又不能用。直接把本机的python从3.6.1降为3.5,再从新安装pyinstaller,运行"pyinstaller -F loader.py"打包,一切顺利,在dist目录下生成了一个loader.exe。试运行下loader.exe,结果却是这样的:

Traceback (most recent call last):
File "loader.py", line , in <module>
options.timeout,options.suffix,options.srv_writer,options.clt_writer )
File "loader.py", line , in __init__
self.srv_writer = importlib.import_module( "writer_" + srv_writer )
File "importlib\__init__.py", line , in import_module
File "<frozen importlib._bootstrap>", line , in _gcd_import
File "<frozen importlib._bootstrap>", line , in _find_and_load
File "<frozen importlib._bootstrap>", line , in _find_and_load_unlocked
ImportError: No module named 'writer_lua'
Failed to execute script loader
请按任意键继续. . .

缺失了模块writer_lua,这是我自己写的一个转换为Lua配置的模块。pyinstaller本来有分析脚本依赖的模块的,但是我这个程序是根据运行时传入的参数动态加载模块的,因为我并不能预先知道用户要把excel转换为什么类型的文件。全部加载所有模块,是一个解决方案,但不太合适,因为我本来的写法是:规定了模块的接口,新增模块时,不需要修改我原有的代码,会自动加载新模块。再次搜索了一下,居然没有找到相同的案例。阅读了下pyinstaller的手册(https://pythonhosted.org/PyInstaller/spec-files.html),发现可以用spec配置文件来打包各种数据的,比如程序的icon,甚至自定义的一些二进制文件。在http://pythonhosted.org/PyInstaller/when-things-go-wrong.html#listing-hidden-importshttp://pythonhosted.org/PyInstaller/hooks.html#understanding-pyinstaller-hooks中提到可以使用hiddenimports选项来导入隐藏的模块。

  查看了下pyinstaller打包的过程,运行"pyinstaller -F loader.py"时确实在当前目录下生成了一个loader.spec文件:

# -*- mode: python -*-

block_cipher = None

a = Analysis(['loader.py'],
pathex=['E:\\linux_share\\github\\py_exceltools'],
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='loader',
debug=False,
strip=False,
upx=True,
console=True )

在hiddenimports中加入自己动态加载的模块,变成hiddenimports=['writer_lua','writer_xml','writer_json'],重新打包。注意,重新打包时不要再运行"pyinstaller -F loader.py"了,因为这个指令会重新生成spec文件,把你修改的覆盖了。直接用"pyinstaller loader.spec"来打包。

  加入动态加载的模块后,整个exe有7M多,运行正常。但是在64bit系统打包出来的程序,是64bit的,不能在32bit下运行。整个工具放在github上:https://github.com/changnet/py_exceltools

利用pyinstaller将python脚本打包发布的更多相关文章

  1. PyInstaller把Python脚本打包成可执行程序教程

    一.说明 一直以来都有把.py文件打包成.exe文件的想法,但总是不够强烈,每次拖着拖着就淡忘了. 昨天帮硬件部门的同事写了个脚本,然后今天下午的时候,他问有没有办法把脚本打包成可执行文件,这样方便以 ...

  2. 将Python脚本打包成可执行文件

    Python是一个脚本语言,被解释器解释执行.它的发布方式: .py文件:对于开源项目或者源码没那么重要的,直接提供源码,需要使用者自行安装Python并且安装依赖的各种库.(Python官方的各种安 ...

  3. [转]Python依赖打包发布详细

    Python依赖打包发布详细   http://www.cnblogs.com/mywolrd/p/4756005.html 将Python脚本打包成可执行文件   Python是一个脚本语言,被解释 ...

  4. Python依赖打包发布详细

    http://www.cnblogs.com/mywolrd/p/4756005.html 将Python脚本打包成可执行文件   Python是一个脚本语言,被解释器解释执行.它的发布方式: .py ...

  5. [Python] 项目打包发布

    一.setuptools - 官方文档: Building and Distributing Packages with Setuptools- 中文文档: Python包管理工具setuptools ...

  6. Python脚本打包成exe执行文件

    需求 一个教辅目录结构检查工具,目录结构是[书籍]-[章节]-[题目|答案]-[*.jpg],后台有个异步处理的服务,需要强依赖这个目录结构. 书籍解析是单独的pipeline,日志对用户不可见,这里 ...

  7. 将python脚本打包为exe可执行文件

    技术背景 在很多情况下,编程人员是在Linux环境下完成的编程任务,但是更多的使用人员是在Windows环境下的,比方说,在参考链接1的文章中提到: 那么我们就不得不考虑一个环境转化的问题.pytho ...

  8. 用PyInstaller把Python代码打包成单个独立的exe可执行文件

    之前就想要把自己的BlogsToWordpress打开成exe了.一直没去弄. 又看到有人提到python打开成exe的问题. 所以打算现在就去试试. 注:此处之所有选用BlogsToWordpres ...

  9. 把 Python 脚本打包成可以直接双击运行的 .exe 文件 【转】

    因为最近要用到 Python 脚本,所以自己学习了一下,顺便学习如何把它打包成 .exe 可执行文件,达到双击运行的效果,网上找了资料,保存下来学习用,原文出处:https://baijiahao.b ...

随机推荐

  1. Ajax请求,跨域小坑

    今天在上班的时候,被坐在旁边项目经理叫过去问了一个Ajax请求跨域的问题,一开始没理解清楚也还有对这个没有理解的透,后面被打击的要死. 当时的需求是需要测试一个已发布的api接口,需要在本地写测试程序 ...

  2. vue 高德地图之玩转周边

    前言:在之前的博客中,有成功引入高德地图,这是以前的地址  vue 调用高德地图. 因为一些需求,需要使用到地图的周边功能. 完整的项目代码请查看  我的github 一 .先看要实现的结果,参考了链 ...

  3. websocket学习和使用

    1)WebSocket介绍 HTML5 Web Sockets规范定义了Web Sockets API,支持页面使用Web Socket协议与远程主机进行全双工的通信.它引入了WebSocket接口并 ...

  4. python web -- django

    一. 安装 django $ pip install django (env)$ python >> import django >> django.VERSION >& ...

  5. Api接口通用安全策略及实现-OSS.Core

    这篇文章一直说写,迟迟没有动手,这两天看到一些应用接口数据被别人爬虫.短信接口被人高频率请求攻击等案列,感觉简单概述分享一下接口安全验证还是有必要的.毕竟当下基本都以客户端应用为主,如果前期疏忽,发布 ...

  6. Excel文件按照指定模板导入数据(用jxl.jar包)

        本文中的方法只适合Excel2003,要读取Excel2007最好使用poi.jar,据说poi.jar还在更新,jxl.jar已经不更新了,处理Excel文件的读写问题最好还是学习poi.j ...

  7. angular.js ng-repeat渲染时出现闪烁问题解决

    当我们前端运用到angular.js框架时,想必大家都会遇到一些坑.其中,我也来分享一个常见的angular.js渲染时出现的坑. 当我们进行页面渲染时,绑定表达式最开始会用{{data.name}} ...

  8. 把编译安装的httpd 实现服务脚本,通过service和chkconfig 进行管理

    把编译安装的httpd 实现服务脚本,通过service和chkconfig 进行管理 1 编译安装httpd 把httpd编译安装在/app/httpd/目录下. 2 在/etc/rc.d/init ...

  9. Unity3D-Shader-复古电影荧幕特效

    [旧博客转移 - 2015年12月6日 18:12]   今天用Shader做了一个复古荧幕效果,老电视机放映的感觉,写篇文章记录一下     原始图片:   没错,这就是电影<泰坦尼克号> ...

  10. 小解系列-自关联对象.Net MVC中 json序列化循环引用问题

    自关联对象在实际开发中用的还是比较多,例如常见的树形菜单.本文是自己实际的一个小测试,可以解决循环引用对象的json序列化问题,文笔不好请多见谅,如有错误请指出,希望有更好的解决方案,一起进步. 构造 ...