Pyinstaller 是一个小的可以打包我们所写的Python脚本,来生成相应的可执行文件。

它是怎么工作的?

PyInstaller读取您编写的Python脚本。它会分析您的代码,以发现您的脚本执行所需的每个其他模块和库。然后它收集所有这些文件的副本 - 包括活动的Python解释器! - 并将它们与您的脚本放在一个文件夹中,或者可选地放在一个可执行文件中。----来自官方文档。

对于绝大多数程序,这可以通过一个简短的命令来完成,

pyinstaller myscript.py

您将捆绑包作为文件夹或文件分发给其他人,他们可以执行您的程序。对于您的用户,该应用程序是自包含的。他们不需要安装任何特定版本的Python或任何模块。他们根本不需要安装Python。

分析:查找程序需要的文件

您的脚本需要什么其他模块和库才能运行?(这些有时被称为“依赖”。)

为了找到答案PyInstaller会import在您的脚本中找到所有语句。它找到导入的模块并在其中查找import 语句,依此类推,直到它具有脚本可能使用的完整模块列表。

PyInstaller了解通常用于Python包的“egg”分发格式。如果您的脚本从“egg”导入模块,PyInstaller会将egg及其依赖添加到所需的文件集中。

PyInstaller还了解许多主要的Python包,包括GUI包 Qt(通过PyQtPySide导入),WxPythonTkInterDjango和其他主要包。有关完整列表,请参阅支持的包

一些Python脚本以PyInstaller无法检测的方式导入模块:例如,通过将__import__()函数与变量数据一起使用imp.find_module()sys.path在运行时使用或操作该值。如果您的脚本需要PyInstaller不知道的文件,您必须帮助它:

  • 您可以在pyinstaller命令行上提供其他文件。
  • 您可以在命令行上提供其他导入路径。
  • 您可以编辑PyInstaller在您第一次为脚本运行时写入的文件。在spec文件中,您可以告诉PyInstaller有关脚本特有的代码模块。myscript.spec
  • 您可以编写“钩子”文件,通知PyInstaller隐藏的导入。如果为其他用户也可能使用的包创建“挂钩”,则可以将挂钩文件提供给PyInstaller

如果您的程序依赖于对某些数据文件的访问,您也可以告诉PyInstaller将它们包含在捆绑包中。您可以通过修改spec文件来执行此操作,该文件是使用规范文件中介绍的高级主题。

为了在运行时查找包含的文件,您的程序需要能够以一种无论是否从捆绑包运行的方式在运行时学习其路径。这包含在运行时信息中

PyInstaller没有包括应该在这个操作系统的任何安装存在库。例如,在Linux中,它不捆绑任何文件,/lib或者/usr/lib假设这些文件可以在每个系统中找到。

捆绑到一个文件夹

PyInstaller应用于myscript.py默认结果时,将命名为单个文件夹myscript。此文件夹包含所有脚本的依赖项,以及一个也命名的可执行文件myscript (myscript.exe在Windows中)。

您压缩文件夹myscript.zip并将其传输给您的用户。他们只需解压缩即可安装程序。用户通过打开文件夹并在其中启动myscript可执行文件来运行您的应用程序。

在使用单文件夹模式时,可以轻松调试在构建应用程序时出现的问题。您可以准确地看到PyInstaller收集到文件夹中的文件。

单文件夹包的另一个优点是,当您更改代码时,只要它导入完全相同的依赖项集,您就只能发送更新的myscript可执行文件。这通常比整个文件夹小得多。(如果更改脚本以便导入更多或不同的依赖项,或者如果依赖项已升级,则必须重新分发整个bundle。)

单文件夹格式的一个小缺点是一个文件夹包含大量文件。您的用户必须myscript在一长串名称或大量图标中找到可执行文件。此外,您的用户可能会意外地将文件拖出文件夹,从而产生问题。

单文件夹程序如何工作

捆绑的程序总是在PyInstaller引导加载程序中开始执行。这是myscript文件夹中可执行文件的核心。

PyInstaller引导程序是为活动平台(Windows,Linux和Mac OS X的,等等)的二进制可执行程序。当用户启动程序时,它就是运行的引导加载程序。引导加载程序创建一个临时的Python环境,以便Python解释器可以在myscript文件夹中找到所有导入的模块和库。

引导加载程序启动Python解释器的副本以执行您的脚本。如果包含所有必要的支持文件,那么通常都会从那里开始。

捆绑到一个文件

PyInstaller可以将您的脚本及其所有依赖项捆绑到一个名为myscriptmyscript.exe在Windows中)的可执行文件中。

优点是您的用户可以获得他们理解的内容,即可以启动的单个可执行文件。缺点是任何相关文件(如README)必须单独分发。此外,单个可执行文件的启动速度比单文件夹捆绑包慢一点。

在尝试捆绑到一个文件之前,请确保捆绑到一个文件夹时应用程序正常工作。这是很多更容易地诊断在一个文件夹模式的问题。

单文件程序如何工作

引导加载程序也是单文件包的核心。启动时,它会在此操作系统的相应临时文件夹位置创建一个临时文件夹。该文件夹已命名,其中xxxxxx是随机数。_MEIxxxxxx

一个可执行文件包含脚本使用的所有Python模块的嵌入式存档,以及任何非Python支持文件(例如.so文件)的压缩副本。引导加载程序解压缩支持文件并将副本写入临时文件夹。这可能需要一点时间。这就是为什么单文件应用程序比单文件夹应用程序启动慢一点的原因。

创建临时文件夹后,引导加载程序与临时文件夹的上下文中的单文件夹包完全相同。当捆绑代码终止时,引导加载程序将删除临时文件夹。

(在Linux和相关系统中,可以/tmp使用“无执行”选项挂载该文件夹。该选项与PyInstaller 单文件包不兼容。它需要执行代码/tmp。)

由于程序会创建一个具有唯一名称的临时文件夹,因此您可以运行该应用程序的多个副本; 他们不会互相干涉。但是,在磁盘空间中运行多个副本是很昂贵的,因为没有任何共享。

如果程序崩溃或被杀死,则不删除该文件夹(在Unix上杀死-9,在Windows上由任务管理器杀死,在Mac OS上杀死“强制退出”)。因此,如果您的应用经常崩溃,您的用户将丢失多个临时文件夹的磁盘空间。_MEIxxxxxx_MEIxxxxxx

可以使用命令行选项控制文件夹的位置。指定的路径存储在可执行文件中,引导加载程序将在指定的文件夹内创建 文件夹。有关详细信息,请参阅 定义提取位置_MEIxxxxxx--runtime-tmpdir_MEIxxxxxx

使用控制台窗口

默认情况下,引导加载程序会创建一个命令行控制台(Linux和Mac OS中的终端窗口,Windows中的命令窗口)。它为Python解释器提供了标准输入和输出的窗口。您的脚本的使用printinput()指向此处。来自Python的错误消息和默认日志记录输出也出现在控制台窗口中。

Windows和Mac OS的一个选项是告诉PyInstaller不提供控制台窗口。引导加载程序启动Python,没有标准输出或输入的目标。当脚本具有用于用户输入的图形界面并且可以正确报告其自己的诊断时,请执行此操作。

Pyinstaller 0的更多相关文章

  1. ZAM 3D 制作简单的3D字幕 流程(二)

    原地址:http://www.cnblogs.com/yk250/p/5663907.html 文中表述仅为本人理解,若有偏差和错误请指正! 接着 ZAM 3D 制作简单的3D字幕 流程(一) .本篇 ...

  2. ZAM 3D 制作3D动画字幕 用于Xaml导出

    原地址-> http://www.cnblogs.com/yk250/p/5662788.html 介绍:对经常使用Blend做动画的人来说,ZAM 3D 也很好上手,专业制作3D素材的XAML ...

  3. 微信小程序省市区选择器对接数据库

    前言,小程序本身是带有地区选着器的(网站:https://mp.weixin.qq.com/debug/wxadoc/dev/component/picker.html),由于自己开发的程序的数据是很 ...

  4. osg编译日志

    1>------ 已启动全部重新生成: 项目: ZERO_CHECK, 配置: Debug x64 ------1> Checking Build System1> CMake do ...

  5. 【原创】关于pyinstaller打包的程序执行出错问题,pyinstaller3.5只支持matplotlib3.0.2已经解决

    之前,在用pyinstaller打包一个python程序时没有问题,后来不知道什么原因,再打包时出现了所谓的pyinstaller打包报错: RecursionError: maximum recur ...

  6. windows 下 pyinstaller distutils not included with latest virtualenv (16.4.0)

    起因 因为windows下python3.7.2内置venv虚拟环境下pyinstaller错误问题,切换virtualenv但是发现最新版本又有其他问题 - -! ModuleNotFoundErr ...

  7. Python的支持工具[1] -> 可执行文件生成工具[0] -> pyinstaller

    pyinstaller pyinstaller安装方式: pip install pyinstaller 使用方法: cmd –> cd dictionary –> pyinstaller ...

  8. 使用pyInstaller发布PathMerge的exe版本(py转换成exe)

    前言 PathMerge是用python写的一个辅助文件夹合并的小工具,它的特点是不用担心合并后文件会丢失,旧文件会创建副本保存下来,除非你手动删除. 详情见:python开发目录合并小工具 Path ...

  9. PyInstaller打包步骤简记

    pyinstaller 下载地址:http://www.pyinstaller.org/ 下载后用cmd进入解压文件夹 python setup.py install 安装. 最近用pyinstall ...

随机推荐

  1. mac下安装postgreSql

    在 mac 下,可以利用 homebrew 直接安装 PostgreSQL: 1 brew install postgresql -v 稍等片刻,PostgreSQL 就安装完成.接下来就是初始数据库 ...

  2. Usaco 滑雪比赛 Bobsledding, 2009 Dec(dp)

    Description 滑雪比赛bobsled 贝西参加了一场高山急速滑雪比赛,滑道总长度为 L.出发时,她的初速度为 1,贝西可以加速 或减速,每过 1 米,她能将速度增加 1.减少 1 或保持不变 ...

  3. WebApi笔记

    WebApi有一段时间没用了,这几天用webapi做了一个接口供第三方调用,又重新折腾了下,做个笔记记录下心得,防止遗忘. 1.webapi使用的RESTful风格的传参方式,其实就是充分利用HTTP ...

  4. Python多线程原理与实现

    Date: 2019-06-04 Author: Sun Python多线程原理与实战 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了解线程池的使用 1 线程基本 ...

  5. criteria的projection做分页

  6. 关于layui.laypage.render 刷新首页没有分页问题

    前言: 最近写项目遇到一个问题,就是使用vue里的layui.laypage.render 分页时,刷新首页会只有一页,但后台传来的数据是有50多页的,所有的数据也都一一对应,调了好久debug,终于 ...

  7. Codeforces Round #499 (Div. 2) F. Mars rover_dfs_位运算

    题解: 首先,我们可以用 dfsdfsdfs 在 O(n)O(n)O(n) 的时间复杂度求出初始状态每个点的权值. 不难发现,一个叶子节点权值的取反会导致根节点的权值取反当且仅当从该叶子节点到根节点这 ...

  8. Pyhton学习——Day11

    # Python中的内部模块# 函数学习的意义:抽取重复代码# 模块:不用重复写,模块及py文件,提高了代码的可维护性,其次,编写代码不必从零开始,当一个模块编写完毕,不必再重复编写# import ...

  9. CSS Grid(CSS网格)

    Grid被设计来做一些Flexbox不能做的事情,所以不是被设计来取代Flexbox的. flexbox 一维的 Grid 二维的 总结:  Grid Items作用在Grid Container的直 ...

  10. C语言基本语法——字符串

    1.什么是字符串 2.字符串与普通字符数组的区别 3.字符串的定义方式 4.字符串的使用 5.什么是字符串数组 6.字符串数组的赋值 7.字符串数组的遍历 1.什么是字符串 • 用双引号引起来的多个字 ...