利用pyinstaller将python脚本打包发布

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

[email protected]:~/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-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

时间: 2024-07-29 16:40:49

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

PyInstaller将python脚本打包成exe可执行程序

一.PyInstaller说明 pyinstaller是一个第三方模块,托管在github上,它是一个把python脚本及其依赖的模块,打包成一个独立的可执行程序,使其能运行在没有安装python环境的机器上.支持Linux/unix /mac 及windows,但注意的是,在什么平台上打包,就会生成对应平台可执行的独立程序,如在windows上打包会生成exe的可执行文件.本文所演示的就是在windows平台使用pyinstaller打包一个简单的exe程序. 二.原始脚本内容如下: 1.生成

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

把 Python 脚本打包成可以直接双击运行的 .exe 文件安装 pip3 install pyinstaller pip install pypiwin32执行 pyinstaller -F -i qq.ico -w test.py -F 指定打包后只生成一个exe格式的文件-D –onedir 创建一个目录,包含exe文件,但会依赖很多文件(默认选项)-c –console, –nowindowed 使用控制台,***面(默认)-w –windowed, –noconsole 使用窗口,无

使用pyinstaller将python文件打包成exe文件

pyinstaller官方网页:http://www.pyinstaller.org/ 官方文档:https://pyinstaller.readthedocs.io/en/stable/ pyinstaller支持Python 2.7和Python 3.3+版本,并且支持Windows(XP+).Mac OS X(10.7+)和Linux,但是只能在对应的系统编译对应的程序. 1.pyinstaller安装 在cmd(命令提示符)中直接安装 1 pip install pyinstaller

win10环境下利用pyinstaller把python代码(.py)打包成可执行文件(.exe)

前言 最近写了一个小小的检测程序,python写起来只需要短短一百行,可是打包起来就没有C那么容易了.下面记录一下我艰难的"打包"过程. 方法一:py2exe py2exe是一种经典的方法,为什么说他经典呢?因为这玩意取了个这么好听的名字,但是只支持到python3.4,你这让我们这种紧跟时代潮流的弄潮儿怎么打包? 好吧,放弃. 方法二:pyinstaller 这是一个看起来比较靠谱的方法,只需要用pip安装,然后在命令窗里面一通操作就可以了.在这里,我参考了另一位老哥的博客(http

用pyinstaller把python代码打包成exe可执行文件

优点: 1. pyinstaller 是跨平台的可以用在linux和windows系统上 2. 操作非常简单,几个命令就搞定了,这个比py2exe容易用多了 缺点: 1. 打包后的体积过大,因为要带python.dll库,所以没有办法 2. 不能和tkinter 等库,打包成单独一个文件 1.下载pyinstaller 目前pyinstaller支持的python版本为2.3-2.7,可以到http://www.pyinstaller.org/官网下载. 2.安装 下载完成后,解压即可. 3.p

【转载】将python脚本打包成exe文件

exe文件也就是可以直接执行的文件.通常我们编好的带py后缀的脚本文件都是需要在有python的环境下执行, 每次通过Win + R打开运行窗口再输入powershell打开控制台,再千辛万苦地cd c:\python27 (change directory) 转换目录到py文件的目录下.最终还是要用python 1.py之类的方法打开脚本.为了让没有安装python的人也能用 我们编好的脚本.我们就要用到PyInstaller这个东东来编译成exe可执行文件. 参考: http://www.c

(转)Python_如何把Python脚本导出为exe程序

原文地址:https://www.cnblogs.com/robinunix/p/8426832.html 一.pyinstaller简介 Python是一个脚本语言,被解释器解释执行.它的发布方式: .py文件:对于开源项目或者源码没那么重要的,直接提供源码,需要使用者自行安装Python并且安装依赖的各种库.(Python官方的各种安装包就是这样做的) .pyc文件:有些公司或个人因为机密或者各种原因,不愿意源码被运行者看到,可以使用pyc文件发布,pyc文件是Python解释器可以识别的二

如何把Python脚本导出为exe程序

转载自: http://www.jianshu.com/p/8dbdfbd3716d 一.pyinstaller简介 pyinstaller将Python脚本打包成可执行程序,使在没有Python环境的机器上运行最新版是pyinstaller 3.1.1.支持python2.7和python3.3+.可运行在Windows,Mac和Linux操作系统下.但它不是跨编译的,也就是说在Windows下用PyInstaller生成的exe只能运行在Windows下,在Linux下生成的只能运行在Lin

分享一个免杀的反弹shell工具(python脚本转换成exe)

有时候网站服务器上有杀毒软件,我们上传的nc.exe.lcx.exe等工具都被杀了,这时候就需要一款免杀的工具来反弹shell. 这篇博客主要是依据国外的一片文章翻译而来,根据国外大佬的教程将Python脚本转换成exe程序即可免杀. 参考链接:https://medium.com/bugbountywriteup/antivirus-evasion-with-python-49185295caf1 第1步:安装Python2.7和Py2exe 一定要安装32位的Python 2.7和32位的P