使用pyinstaller将python脚本打包成exe可执行文件

搜先安装pyinstaller

pip install pyinstaller

然后打开cmd命令行工具,定位到python脚本所在的目录

执行命令:

pyinstaller -F 脚本名称(带后缀名)

但是pyinstaller默认只能打包python2.7和python3.3-3.5的脚本,如果是python3.6版本,会报错

 IndexError: tuple index out of range

下载pyinstaller,解压之后,将里面的Pyinstaller文件夹拷贝到你的python安装目录下的Lib/site-packages中,覆盖原有的Pyinstaller包,再使用上面的打包命令,有可能还会让你安装pywin32-ctypes,使用pip install pywin32-ctypes后再次执行打包命令即可。

按照上诉步骤打包的可执行文件在执行时会弹出dos窗口,且需要手动关闭才可以,在打包时可以加上 --noconsole参数,

pyinstaller -F 脚本名称 --noconsole

加上--noconsole参数后打包后,可执行文件在运行时就不会弹出dos窗口了 

解决无法识别包的问题

为了找出你的python文件的所有依赖项,pyinstaller会查看你的python脚本中所有的import声明 ,找到所有导入的模块,直到拥有了你的python脚本执行所需的所有模块的完整列表。
PyInstaller可以识别出python包常用的”egg”格式,所以,如果你的脚本是从一个”egg”中导入一个模块,那么pyinstaller将会把egg和它的依赖项一并添加进来。
一些常用的GUI包目前也都被pyinstaller支持,例如:Qt,WxPython, TkInter, Django等等。
或许你的一些脚本中使用了import()等格式的导入,这是pyinstaller无法识别的包导入格式,或者在运行时操作sys.path的值等等。这些都是pyinstaller无法直接识别的。需要你手动做一些其他的工作帮助pyinstaller识别这些内容。
 

  • 通过向pyinstaller添加需要的文件或者路径
  • 编辑 你的文件名.spec文件来添加pystaller无法自动识别的内容(后续将详细介绍)
  • 写hook文件来提醒pyinstaller那些隐藏的import

使用命令行添加未识别的import模块

pyinstaller –hidder-import=ModuleName hello.py

当你执行

pyinstaller options.. myscript.py

的时候,pyinstaller做的第一件事情就是生成一个myscript.spec文件,这个文件在–specpath=文件夹下,默认情况下是在当前路径下。
spec file如下:

block_cipher = None
a = Analysis(['minimal.py'],
     pathex=['/Developer/PItests/minimal'],
     binaries=None,
     datas=None,
     hiddenimports=[],
     hookspath=None,
     runtime_hooks=None,
     excludes=None,
     cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
     cipher=block_cipher)
exe = EXE(pyz,... )
coll = COLLECT(...)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
包含了你的脚本名字以及你给pyinstaller命令的各种选项。多数情况下,使用命令行是足够的,但以下几种情况需要你修改spec file文件:

1,想要将数据文件捆绑到应用程序中
2,想要包含run-time库(.dll或.so文件)
3,想要添加python的run-time选项
4,想要创建具有合并公共模块的多程序包
首先,使用下面的命令创建一个spec file:
pyi-makespec options name.py [other scripts …]

在spec file中,你会看到四个类: Analysis, PYZ, EXE 和 COLLECT。

Analysis使用列表列出所有输入的python脚本。它会分析所有的导入包和依赖项,并将结果赋给输出对象(例子中的a)。a是一个列表的形式,包含如下几项:
scripts:所有输入python脚本;
pure:输入脚本中命名的纯python模块;
binaries:脚本中需要的非python模块;
datas:应用包含的非二进制文件。

pyz:该类的一个实例将包含a.pure中的所有python模块;

EXE: 该类的一个实例将生成可执行文件;
COLLECT:该类的一个实例将创建一个包含除上述内容以外的其他所有部分的输出文件;
 

例如添加一个src文件夹中存在的README.txt文件

a = Analysis(...
     datas=[ ('src/README.txt', '.') ],
     ...
     )
1
2
3
4
例如:添加某个文件夹下的所有.mps文件:

a = Analysis(...
     datas= [ ('/mygame/sfx/*.mp3', 'sfx' ) ],
     ...
     )

这样,所有/mygame/sfx/文件夹下的mp3文件都会被添加到你的应用中。
如果你要添加一系列的数据文件,使用下面的方式可以增加可读性:

added_files = [
         ( '/mygame/sfx/*.mp3', 'sfx' ),
         ( 'src/README.txt', '.' )
         ]
    a = Analysis(...
         datas = added_files,
         ...
         )
————————————————
版权声明:本文为CSDN博主「yeizisn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yeizisn/article/details/52955130

使用某个模块中的数据文件
如果你想要添加的某个数据文件是来源于某个python模块。
例如:你的文件中有一个叫做helpmod的模块,它包含以下几个部分:

helpmod:
init.py
helpmod.py
help_data.txt

事实上,使用命令行的pyinstaller进行压缩,像help_data.txt文件是不会被包含进去的,因此应当修改spec file文件如下:

a = Analysis(...
     datas= [ ('helpmod/help_data.txt', 'helpmod' ) ],
     ...
     )

另外一种方法:使用标准库函数 pkgutil.get_data( )在你的helpmod.py中:

import pkgutil
help_bin = pkgutil.get_data( 'helpmod', 'help_data.txt' )

参考怎样打包django项目

使用pyinstaller打包django项目_ol_m_lo的博客-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值