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

本文介绍如何使用PyInstaller将Python脚本打包成exe文件,包括解决打包过程中的常见问题,如依赖丢失、路径问题等,并提供修改.spec文件的方法以包含额外的资源。

搜先安装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,
         ...
         )
————————————————
版权声明:本文为优快云博主「yeizisn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/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' )

pyinstaller 包的用法参考

https://www.cnblogs.com/klb561/p/18199507

如果出现错误可以参考

报错问题:"pyinstaller打包后无法运行"是一个非常广泛的描述,具体原因可能有很多。以下是一些常见的原因及其解决方法:

  1. 依赖丢失:打包时可能漏掉了某些依赖文件。

    • 解决方法:重新打包,确保使用--hidden-import=module_name选项来显式包含所有依赖的模块。

  2. 路径问题:程序在运行时无法找到正确的文件路径。

    • 解决方法:确保程序中的所有路径正确,可以使用相对路径或者在程序中指定正确的工作目录。

  3. 权限问题:程序没有足够的权限去访问某些资源。

    • 解决方法:以管理员身份运行程序,或者修改程序,使其不需要过高权限即可运行。

  4. 平台兼容性:程序可能在打包时使用了不兼容当前操作系统的代码或者库。

    • 解决方法:确保所有使用的库都是跨平台的,或者针对目标平台进行了测试。

  5. 字节码问题:Python版本不匹配导致字节码不兼容。

    • 解决方法:确保打包时使用的Python版本和目标机器上的Python版本一致。

  6. 资源文件缺失:打包时没有正确包含必要的资源文件。

    • 解决方法:确保使用--add-data选项正确包含所有资源文件。

  7. 控制台窗口关闭:程序可能在运行完毕后立即关闭了控制台窗口。

    • 解决方法:修改程序,使其在完成操作后等待用户输入,避免立即关闭窗口。

  8. 打包错误:打包过程中可能存在错误,导致生成的可执行文件无法正常运行。

    • 解决方法:重新打包,并检查打包过程中的输出信息,查找可能的错误提示。

针对这些常见问题,你可以按照以下步骤排查和解决问题:

  1. 检查打包命令:确认使用的打包命令是否正确,是否遗漏了某些依赖。

  2. 检查依赖:使用pyinstaller --onefile --detailed-help查看所有可用的打包选项,确保所有依赖都被包括。

  3. 检查错误日志:如果有错误日志,查看错误信息,确定问题所在。

  4. 检查Python版本:确保打包和运行时的Python版本一致。

  5. 检查程序路径:确保程序中的路径正确,可以使用绝对路径进行测试。

  6. 以管理员身份运行:尝试以管理员身份运行程序,看是否解决权限问题。

  7. 检查兼容性:确保程序不依赖于特定平台的特性。

  8. 检查资源文件:确保所有必要的资源文件都被正确包含。

  9. 控制台交互:如果程序是为了在控制台运行,确保控制台没有立即关闭。

  10. 重新打包:如果以上步骤都不能解决问题,尝试清理打包生成的临时文件和目录,重新打包。

如果问题依然无法

参考怎样打包django项目

使用pyinstaller打包django项目_ol_m_lo的博客-优快云博客

缺少一些隐藏的包不能运行时

python打包后打开闪退问题解决方法总结_no module named talib.streams-优快云博客

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值