Pyinstaller 0

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,没有标准输出或输入的目标。当脚本具有用于用户输入的图形界面并且可以正确报告其自己的诊断时,请执行此操作。

原文地址:https://www.cnblogs.com/PrayG/p/10830770.html