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. layer Tips参数使用

    layer.tips(content, follow, options) - tips层type:4的深度定制.也是我本人比较喜欢的一个层类型,因为它拥有和msg一样的低调和自觉,而且会智能定位,即灵 ...

  2. Android中的事件分发机制

    Android中的事件分发机制 作者:丁明祥 邮箱:2780087178@qq.com 这篇文章这周之内尽量写完 参考资料: Android事件分发机制完全解析,带你从源码的角度彻底理解(上) And ...

  3. solarwinds之配置系统管理(System manager)

    配置windows的 1.  打开System Manager   2.  点击new新加一个接口   3.  选择要监控的资源   4.  确认好自己要监控的资源后如下   5.  这里以监控内存使 ...

  4. UNP学习笔记3——基本UDP套接字编程

    1 概述 TCP和UDP网络编程存在一些本质的差异,主要是由于传输层的差别:UDP是无连接的不可靠的数据报协议,而TCP是面向连接的字节流协议. 下图是典型的UDP客户端和服务器之间的通信流程.客户不 ...

  5. JS自定义功能函数实现动态添加网址参数修改网址参数值

    无论是前端开发还是后台设计,很多时候开发人员都需要获取当前或目标网址的相关信息.这个已有现成的内置对象属性可以直接调用了(下面是获取当前页面的参考代码) 复制代码 代码如下: <script t ...

  6. Day 03 知识点[python程序运行的方式、变量、注释、内存管理、数据类型]

    执行Python程序的两种方式 第一种:交互式,在cmd中运行 优点:调试程序方便,直接给出结果 缺点:无法保存,关掉cmd窗口数据就消失 第二种:命令行式通过cmd中输入Python3文本 优点:数 ...

  7. 01 C#基础

    第一天 .net平台(中国移动互联网平台): .net框架(信号塔): CLR(公共语言运行时) .Net类 库 我们使用的语言是——C# 2.解决方案项目与类的关系: 解决方案:公司 项目:部门 类 ...

  8. python 添加自定义库

    首先,写一个库文件aaa.py 格式,在python安装目录下面创建一个空的文件夹命名Function 或者其他文件名, 然后将文件保存在python 安装目录下面的一个Function文件夹下面. ...

  9. poj 2663 Tri Tiling (状压dp+多米诺骨牌问题+滚动数组反思)

    本来直接一波状压dpAC的 #include<cstdio> #include<cstring> #include<algorithm> #define REP(i ...

  10. react生命周期知识点

    react生命周期知识点 一个React组件的生命周期分为三个部分:实例化.存在期和销毁时. 实例化 组件在客户端被实例化,第一次被创建时,以下方法依次被调用: 1.getDefaultProps2. ...