iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python3快速入门(十八)——PyI
  • 942
分享到

Python3快速入门(十八)——PyI

入门快速PyI 2023-01-31 08:01:22 942人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

一、PyInstaller简介 1、PyInstaller简介 PyInstaller是一个跨平台的python应用打包工具,支持 windows/linux/MacOS三大主流平台,能够把 Python 脚本及其所在的 Python 解

一、PyInstaller简介

1、PyInstaller简介

PyInstaller是一个跨平台的python应用打包工具,支持 windows/linux/MacOS三大主流平台,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,从而允许最终用户在无需安装 Python 的情况下执行应用程序。
PyInstaller 制作出来的执行文件并不是跨平台的,如果需要为不同平台打包,就要在相应平台上运行PyInstaller进行打包。

2、PyInstaller安装

pip install PyInstaller

二、PyInstaller基础用法

1、PyInstaller使用

pyinstaller main.py
PyInstaller 最简单使用只需要指定作为程序入口的脚本文件。PyInstaller 执行打包程序后会在当前目录下创建下列文件和目录:
main.spec 文件,其前缀和脚本名相同,指定了打包时所需的各种参数;
build 子目录,其中存放打包过程中生成的临时文件。warnxxxx.txt文件记录了生成过程中的警告/错误信息。如果 PyInstaller 运行有问题,需要检查warnxxxx.txt文件来获取错误的详细内容。xref-xxxx.html文件输出 PyInstaller 分析脚本得到的模块依赖关系图。
dist子目录,存放生成的最终文件。如果使用单文件模式将只有单个执行文件;如果使用目录模式的话,会有一个和脚本同名的子目录,其内才是真正的可执行文件以及附属文件。

2、PyInstaller命令行选项

PyInstaller命令行选项可以通过帮助信息查看:
pyinstaller --help
-y | --noconfirm:直接覆盖输出文件,而无需提示,在多次重复运行命令时可避免反复确认。
-D | --onedir:生成包含执行文件的目录(默认行为)。
-F | --onefile:生成单一的可执行文件,不推荐使用。
-i | --icon [.ico | .exe | .icns]:为 Windows/Mac 平台的执行文件指定图标。
--version-file [filename]:添加文件版本信息。
-c | --console | --nowindowed:通过控制台窗口运行程序 并且分配标准输入/输出,(默认行为)。
-w | --windowed | --noconsole:不创建控制台窗口,也不分配标准输入/输出,主要用来运行 GUI 程序。没有输入输出会给调试带来一定困难,因此即便是 GUI 程序,建议在调试时禁用本选项,在最终发布时再打开。
--add-data [file:dir]:添加数据文件。如果有多个文件需要添加,本选项可以出现多次。参数的格式为文件名+输出目录名,用路径分隔符分割,在 Windows 下使用 ;,其它系统下则使用 :。 如果输出到和脚本相同的目录,则使用 . 作为输出目录。
--add-binary [file:dir]:添加二进制文件,即运行程序所需的.exe/.dll/.so 等。

3、单目录模式

单目录模式是 PyInstaller 将 Python 程序编译为同一个目录下的多个文件,其中 xxxx.exe 是程序入口点(xxxx 是脚本文件名称,可以通过命令行修改)。单目录模式是 PyInstaller 的默认模式,可以自己加上 -D 或者 --onedir 开关显式开启。
单目录模式打包生成的目录除可执行文件外,还包括 Python 解释器(PythonXX.dll)、系统运行库(ucrtbase.dll 以及其它 apixx.dll),以及一些编译后的 Python 模块(.pyd 文件)。

4、单文件模式

单文件模式是将整个程序编译为单一的可执行文件。需要在命令行添加 -F 或者 --onefile 开关开启。
Python脚本是解释型程序,而不是 原生的编译程序,并不能产生出真正单一的可执行文件。如果使用单文件模式,PyInstaller打包生成的是自动解压程序,需要先把所有文件解压到一个临时目录(通常名为_MEIxxxx,xxxx是随机数字),再从临时目录加载解释器和附属文件。程序运行完毕后,如果一切正常,会将临时目录再删除。
PyInstaller会对运行时的Python解释器修改。如果直接运行 Python 脚本,那么sys.frozen 变量不存在,如果通过 PyInstaller 生成的可执行文件运行,PyInstaller 会设置sys.frozen 变量为 True;如果使用单文件模式,sys._MEIPASS 变量包含了PyInstaller 自动创建的临时目录名。
单文件模式因为有临时目录和解压文件过程,所以程序启动速度会比较慢。如果程序运行到一半崩溃,则临时目录将没有机会被删除。

三、PyInstaller规格文件

PyInstaller 在生成文件的同时会创建一个相应的.spec 文件,.spec 文件本质上是一个特殊的 Python 脚本,记录了生成所需的指令。

1、Spec文件生成

使用pyinstaller [options] xxx.py进行打包时,PyInstaller 会首先根据选项生成对应的 .spec 文件,然后执行 .spec 文件所指定的过程生成最终文件。因此,可以直接指定spec文件执行打包过程。
pyinstaller [options] xxx.spec

2、Spec文件格式

单目录模式生成的spec 文件格式如下:

a = Analysis(...)
pyz = PYZ(...)
exe = EXE(...)
coll = COLLECT(...)

单文件模式生成的spec 文件格式如下:

a = Analysis(...)
pyz = PYZ(...)
exe = EXE(...)

单文件模式是将所有内容统一打包到 .exe,而单目录模式除了生成 .exe 外,还需要拷贝其它附属文件。
Analysis用于分析脚本的引用关系,并将所有查找到的相关内容记录在内部结构中,供后续步骤使用;
PYZ将所有 Python 脚本模块编译为对应的 .pyd 并打包;
EXE:将打包后的 Python 模块及其它文件一起生成可执行的文件结构;
COLLECT:将引用到的附属文件拷贝到生成目录的对应位置。
如果数据文件很多导致 Analysis 太长,则可以提取为单独的变量。

data_files = [(...)]
a = Analysis(...,
             datas=data_files,
             ...)

可以为数据/二进制文件指定通配符,从而匹配同一类型的多个文件。

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

可以将指定文件和指定目录打包进行打包,如下:

a = Analysis(...,
             datas=[('config.ini', '.'), ('data', 'data')],
             ...)

将config.ini文件打包当可执行文件当前目录下,将data目录打包到可执行文件当前目录下。

四、PyInstaller Hook机制

1、PyInstaller Hook简介

PyInstaller 使用递归方法,从入口的脚本文件逐个分析,获取依赖模块。
PyInstaller 能识别 ctypes、SWIG、Cython 等形式的模块调用,但文件名必须为字面值。但PyInstaller 无法识别动态和调用,例如 import、exec、eval,以及以变量为参数的调用。
当 PyInstaller 识别完所有模块后,会在内部构成一个树形结构表示调用关系图,调用关系在生成目标时也会一并输出(xref-xxxx.html 文件)。PYZ 步骤会将所有识别到的模块汇集起来,如果有必要会编译成.pyd,然后将文件打包。但仍然存在以下问题:
(1)由于动态模块调用未必可以自动识别到,因此不会打包到文件中,执行时肯定会出现问。
(2)有些模块并非是以模块的形式,而是通过文件系统去访问 .py 文件,代码在运行时同样会出现问题。
为了解决上述问题,PyInstaller引入了Hooks机制,对于两种问题引入了两种类型的 Hook。两种 Hook 主要是按照加载时间区分,第一种Hook在 PyInstaller 文档中没有明确的命名,是在生成过程中,导入特定模块时调用的,称为 Import Hook;第二种是Runtime Hook,是在执行文件启动期间、加载特定模块时调用的。

2、Import Hooks

PyInstaller 定义的所有 Hook 在 PyInstaller 安装目录的 hooks 子目录下,文件的命名均为 hook-[模块名].py 的形式,即为 Import Hook。
当 PyInstaller 生成过程中找到特定的导入模块,就会到hooks目录下查找是否存在对应的Hook,如果存在,则执行之。
hook-PyQt5.py文件如下:

import os

from PyInstaller.utils.hooks import collect_system_data_files
from PyInstaller.utils.hooks.qt import pyqt5_library_info, get_qt_binaries

# Ensure PyQt5 is importable before adding info depending on it.
if pyqt5_library_info.version:
    hiddenimports = [
        # PyQt5.10 and earlier uses sip in an separate package;
        'sip',
        # PyQt5.11 and later provides SIP in a private package. Support both.
        'PyQt5.sip'
    ]

    # Collect the ``qt.conf`` file.
    datas = [x for x in
             collect_system_data_files(pyqt5_library_info.location['PrefixPath'],
                                       'PyQt5')
             if os.path.basename(x[0]) == 'qt.conf']

    # Collect required Qt binaries.
    binaries = get_qt_binaries(pyqt5_library_info)

hiddenimports是PyInstaller 用来描述并非通过 import 明确导入,而是通过其它动态机制加载的模块。

3、Runtime Hooks

Runtime Hooks均位于 PyInstaller 安装目录下的loader\rthooks 子目录下,并且命名方式是 pyi_rth_[模块名称].py(rth 代表 run time hook)。
loader\rthooks.dat内容是一个字典,记录了系统中所有支持的 Runtime Hooks。rthooks.dat文件如下:

{
    'certifi':    ['pyi_rth_certifi.py'],
    'Django':     ['pyi_rth_djanGo.py'],
    'enchant':    ['pyi_rth_enchant.py'],
    'gi':         ['pyi_rth_gi.py'],
    'gi.repository.Gio':    ['pyi_rth_gio.py'],
    'gi.repository.GLib':   ['pyi_rth_glib.py'],
    'gi.repository.GdkPixbuf':    ['pyi_rth_gdkpixbuf.py'],
    'gi.repository.Gtk':    ['pyi_rth_gtk.py'],
    'gi.repository.Gst':    ['pyi_rth_gstreamer.py'],
    'gst':        ['pyi_rth_gstreamer.py'],
    'kivy':       ['pyi_rth_kivy.py'],
    'kivy.lib.gstplayer': ['pyi_rth_gstreamer.py'],
    'matplotlib': ['pyi_rth_mplconfig.py', 'pyi_rth_mpldata.py'],
    'osgeo':      ['pyi_rth_osgeo.py'],
    'pkg_resources':  ['pyi_rth_pkgres.py'],
    'PyQt4':      ['pyi_rth_qt4plugins.py'],
    'PyQt5':      ['pyi_rth_pyqt5.py'],
    'PyQt5.QtWEBEngineWidgets': ['pyi_rth_pyqt5webengine.py'],
    'PySide':      ['pyi_rth_qt4plugins.py'],
    'PySide2':      ['pyi_rth_pyside2.py'],
    'PySide2.QtWebEngineWidgets': ['pyi_rth_pyside2webengine.py'],
    '_tkinter':    ['pyi_rth__tkinter.py'],
    'traitlets':  ['pyi_rth_traitlets.py'],
    'twisted.internet.Reactor':        ['pyi_rth_twisted.py'],
    'usb':        ['pyi_rth_usb.py'],
    'win32com':   ['pyi_rth_win32comgenpy.py'],
    'multiprocessing': ['pyi_rth_multiprocessing.py'],
    'nltk': ['pyi_rth_nltk.py'],
}

Runtime Hooks 是在执行文件运行期间执行的。PyInstaller 修改了模块加载机制,当运行期间加载任何模块时,PyInstaller 会检查是否有对应的 Runtime Hook,如果有,则运行相应Hook。因此,Runtime Hooks 是和脚本一起编译到可执行文件中的。
pyi_rth_pyqt5.py文件如下:

import os
import sys

# The path to Qt's components may not default to the wheel layout for
# self-compiled PyQt5 installations. Mandate the wheel layout. See
# ``utils/hooks/qt.py`` for more details.
pyqt_path = os.path.join(sys._MEIPASS, 'PyQt5', 'Qt')
os.environ['QT_PLUGIN_PATH'] = os.path.join(pyqt_path, 'plugins')
os.environ['QML2_IMPORT_PATH'] = os.path.join(pyqt_path, 'qml')

五、错误调试

使用PyInstaller进行打包时,最常见的错误是Failed to execute script xxx,通常做法是先使用pyinstaller -c xxx.py将应用打包为控制台应用,在命令行执行相应可执行程序查看错误输出,进而逐个排除错误。

--结束END--

本文标题: Python3快速入门(十八)——PyI

本文链接: https://www.lsjlt.com/news/192477.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python3快速入门(十八)——PyI
    一、PyInstaller简介 1、PyInstaller简介 PyInstaller是一个跨平台的Python应用打包工具,支持 Windows/Linux/MacOS三大主流平台,能够把 Python 脚本及其所在的 Python 解...
    99+
    2023-01-31
    入门 快速 PyI
  • Python3快速入门(八)——Pyth
    1、JSON简介 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,是基于ECMAScript的一个子集。 2、json模块简介 Python3 中可以使用 json 模块来对 JSON 数据...
    99+
    2023-01-31
    入门 快速 Pyth
  • Python3快速入门(十)——Pyth
    一、socket模块简介 Python 提供了两个级别访问的网络服务,低级别的网络服务支持基本的 Socket,提供了标准的BSD Sockets API,可以访问底层操作系统Socket接口的全部方法;高级别的网络服务模块 Socket...
    99+
    2023-01-31
    入门 快速 Pyth
  • Python3快速入门(十四)——Pan
    一、DataFrame IO 1、CSV文件 pandas.read_csv(filepath_or_buffer, na_values='NAN', parse_dates=['Last Update'])从CSV文件中读取数...
    99+
    2023-01-31
    入门 快速 十四
  • Python3快速入门(十三)——Pan
    一、Pandas数据结构简介 Pandas有三种主要数据结构,Series、DataFrame、Panel。Series是带有标签的一维数组,可以保存任何数据类型(整数,字符串,浮点数,Python对象等),轴标签统称为索引(index)...
    99+
    2023-01-31
    入门 快速 Pan
  • Python3快速入门(十五)——Pan
    一、函数应用 1、函数应用简介 如果要将自定义函数或其它库函数应用于Pandas对象,有三种使用方式。pipe()将函数用于表格,apply()将函数用于行或列,applymap()将函数用于元素。 2、表格函数应用 可以通过将函数对象和...
    99+
    2023-01-31
    入门 快速 十五
  • Python3快速入门(十二)——Num
    一、NumPy简介 1、NumPy简介 NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,同时对数组运算提供了大量的数学函数库。Numpy 是一个运行速度非常快的数学库,...
    99+
    2023-01-31
    入门 快速 十二
  • Python3快速入门(十六)——Mat
    一、Matplotlib简介 1、Matplotlib简介 Matplotlib是 Python 2D-绘图领域使用最广泛的套件,可以简易地将数据图形化,并且提供多样化的输出格式。matplotlib有两个接口,一个是状态机层的接口,通过...
    99+
    2023-01-31
    入门 快速 十六
  • Python3快速入门(十一)——Pyt
    一、mysql-connector 驱动 1、mysql-connector 简介 mysql-connector 是 MySQL 官方提供的驱动器。使用pipenv进行包管理,安装命令如下:pipenv install mysql-co...
    99+
    2023-01-31
    入门 快速 Pyt
  • Python3快速入门
    Python3快速入门Python3快速入门(一)——Python简介https://blog.51cto.com/9291927/2385592Python3快速入门(二)——Python3基础https://blog.51cto.com...
    99+
    2023-01-31
    入门 快速
  • python3.x 快速入门
    Edit the > 2018/6/15 11:26:53 1认识Python 人生苦短,我用python - 优雅,明确,简单 是python设计哲学 - python的设计目标之一, 是让代码具备高度的可阅读性 ...
    99+
    2023-01-31
    入门 快速
  • Python3快速入门(一)——Pyth
    一、Python简介 1、Python简介 Python是一种解释型、面向对象、动态数据类型的高级程序设计语言,由荷兰Guido van Rossum于1989年底发明,第一个公开发行版于1991年发布,Python源代码遵循 GPL(G...
    99+
    2023-01-31
    入门 快速 Pyth
  • Python3快速入门(九)——Pyth
    一、Python线程模块 1、线程简介 一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程本身不拥有系统资源,与进程内的其它线程共享进程的所有资源。一个进程...
    99+
    2023-01-31
    入门 快速 Pyth
  • Python3快速入门——(3)dict
    #先回忆下列表的操作animals=["cat","dog","rabbit"] #找到list中的某个值(第一种方法)for animal in animals: if(animal=="cat"): ...
    99+
    2023-01-31
    入门 快速 dict
  • Python3快速入门(四)——Pyth
    一、Python包简介 1、包 Python中使用包管理模块,包通常对应一个目录,必须在目录下创建一个init.py模块,init.py模块的模块名称即为包名,Python才会将目录解析为包。init.py文件内可以定义初始化包的内容,导...
    99+
    2023-01-31
    入门 快速 Pyth
  • Python3快速入门(二)——Pyth
    一、Python3语法基础 1、Python3编码 默认情况下,Python 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串,可以为Python源码文件指定不同的编码,如下:# -*- coding: utf-8 -...
    99+
    2023-01-31
    入门 快速 Pyth
  • Python3快速入门(七)——Pyth
    1、re模块简介 re 模块提供 Perl 风格的正则表达式模式,使 Python 语言拥有全部的正则表达式功能。 2、正则表达式模式 模式字符串使用特殊的语法来表示一个正则表达式:正则表达式模式中的字母和数字匹配同样的字符串;多数字母和...
    99+
    2023-01-31
    入门 快速 Pyth
  • Python3快速入门(三)——Pyth
    一、Python3标准数据类型 Python3 中有六种标准数据类型:A、Number(数字)B、String(字符串)C、List(列表)D、Tuple(元组)E、Set(集合)F、Dictionary(字典)Python3 的六种标准...
    99+
    2023-01-31
    入门 快速 Pyth
  • Python3快速入门(五)——Pyth
    一、函数定义 1、函数定义 Python 定义函数使用 def 关键字,一般格式如下: def function_name(parameter_list): pass 默认情况下,参数值和参数名称按函数声明中定义的顺序进行匹配。函...
    99+
    2023-01-31
    入门 快速 Pyth
  • Python3快速入门(六)——Pyth
    一、面向对象技术简介 1、面向对象简介 面向对象编程(Object Oriented Programing,OOP)是一种编程思想,OOP把对象当成程序的一个基本单元,一个对象包含数据和操作数据的方法。面向对象编程的三大特性如下:A、封装...
    99+
    2023-01-31
    入门 快速 Pyth
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作