利用pyinstaller将python脚本打包发布

简介:

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

xzc@xzc-HP-ProBook-4446s:~/Documents/code/github/py_exceltools$ ls -lh
总用量 80K
drwxrwxr-x 2 xzc xzc 4.0K  7月 27 23:03 bin
drwxrwxr-x 2 xzc xzc 4.0K  7月 27 23:03 client-rw-rw-r-- 1 xzc xzc 7.7K  7月 27 23:03 decoder.py-rw-rw-r-- 1 xzc xzc  893  7月 27 23:03 error.py-rw-rw-r-- 1 xzc xzc  16K  7月 27 23:03 example.xlsx-rw-rw-r-- 1 xzc xzc  131  7月 27 23:03 lancher.bat-rw-rw-r-- 1 xzc xzc  127  7月 27 23:03 lancher.sh-rw-rw-r-- 1 xzc xzc 3.9K  7月 27 23:03 loader.py-rw-rw-r-- 1 xzc xzc  705  7月 27 23:03 loader.spec-rw-rw-r-- 1 xzc xzc 2.4K  7月 27 23:03 README.md
drwxrwxr-x 2 xzc xzc 4.0K  7月 27 23:03 server-rw-rw-r-- 1 xzc xzc 4.0K  7月 27 23:03 writer_json.py-rw-rw-r-- 1 xzc xzc 7.2K  7月 27 23:03 writer_lua.py-rw-rw-r-- 1 xzc xzc 5.6K  7月 27 23:03 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 96, in <module>options.timeout,options.suffix,options.srv_writer,options.clt_writer )
File "loader.py", line 25, in __init__
self.srv_writer = importlib.import_module( "writer_" + srv_writer )
File "importlib\__init__.py", line 126, in import_module
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 956, 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-imports和http://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"来打包。















本文转自xsster51CTO博客,原文链接:http://blog.51cto.com/12945177/1951665 ,如需转载请自行联系原作者




相关文章
|
2天前
|
Python Perl
LabVIEW调用Perl和Python脚本
LabVIEW调用Perl和Python脚本
|
4天前
|
缓存 人工智能 算法
编写高效的Python脚本:性能优化的策略与技巧
编写高效的Python脚本需要综合考虑多个方面,包括代码结构、数据结构和算法选择等。本文将探讨在Python编程中提高脚本性能的方法,包括优化数据结构、选择合适的算法、使用Python内置函数以及通过并行和异步编程提升效率。这些技巧旨在帮助开发者在不同应用场景中编写出高性能的Python代码。
|
14天前
|
Linux iOS开发 MacOS
pyinstaller---Python代码的打包神器,一键将python代码打包成exe可执行文件
pyinstaller---Python代码的打包神器,一键将python代码打包成exe可执行文件
|
15天前
|
存储 网络安全 数据安全/隐私保护
【专栏】Python 网络设备管理中,`ConnectHandler`(Paramiko库)和`telnetlib`模块常用于设备交互。
【4月更文挑战第28天】Python 网络设备管理中,`ConnectHandler`(Paramiko库)和`telnetlib`模块常用于设备交互。`ConnectHandler`简化SSH连接,便于与网络设备交互,而`telnetlib`是Python内置模块,支持Telnet协议的远程登录操作。两者都提供命令执行和响应接收功能。示例代码展示了如何使用它们获取防火墙设备的版本信息,降低了代码复杂度,提高了可读性和维护性。
|
15天前
|
网络安全 数据安全/隐私保护 Python
【专栏】如何使用 Python 编写脚本批量备份交换机配置
【4月更文挑战第28天】本文介绍如何使用 Python 编写脚本批量备份交换机配置。主要步骤包括了解交换机命令和接口,安装 `paramiko` 库,获取交换机登录信息。脚本实现分为建立 SSH 连接,执行备份命令并保存结果。示例脚本中,定义了 `backup_switch_config` 函数遍历交换机列表进行备份,每次备份后等待一段时间。此方法能有效提高网络管理效率。
|
17天前
|
测试技术 持续交付 项目管理
hatch,现代化的 Python 项目管理和打包工具!
hatch,现代化的 Python 项目管理和打包工具!
23 2
|
24天前
|
小程序 Python
Python基础之简单的小程序和小脚本
这个Python教程介绍了两个小程序。首先是一个账户管理类小程序,支持存款、取款和查询余额功能,确保金额始终保留两位小数。用户可以输入初始金额创建账户,并进行存取款操作。其次,是一个检查作业提交的脚本,它遍历指定目录,找出未提交作业(即没有对应ID文件)的学生ID。用户输入目录路径后,脚本会显示未提交作业的学生ID,如果所有人都提交了,则显示相应消息。
|
26天前
|
Python
Python脚本的两种实现
Python脚本的两种实现
|
1月前
|
JSON 测试技术 持续交付
自动化测试与脚本编写:Python实践指南
【4月更文挑战第9天】本文探讨了Python在自动化测试中的应用,强调其作为热门选择的原因。Python拥有丰富的测试框架(如unittest、pytest、nose)以支持自动化测试,简化测试用例的编写与维护。示例展示了使用unittest进行单元测试的基本步骤。此外,Python还适用于集成测试、系统测试等,提供模拟外部系统行为的工具。在脚本编写实践中,Python的灵活语法和强大库(如os、shutil、sqlite3、json)助力执行复杂测试任务。同时,Python支持并发、分布式执行及与Jenkins、Travis CI等持续集成工具的集成,提升测试效率和质量。
|
1月前
|
开发者 索引 Python
Python应用发布常见打包
【4月更文挑战第5天】Python应用发布常见打包
26 1