跳转到主要内容

用于创建可执行存档的工具。

项目描述

这是什么?

pyzzer 是一个简单的工具,可以从Python包和模块源创建可运行的zip存档。它使用Python的标准库 zipfile 模块来构建可运行的.zip文件。使存档可运行有几个要素

  • 它们需要一个 shebang行,指示给POSIX shell用于运行的本地可执行程序。由 pyzzer 创建的存档在其前面有一个shebang行,默认为 #! /usr/bin/env python,但可以通过 pyzzer 的命令行参数来覆盖。

  • 在POSIX系统上,可执行位应在存档的文件系统属性中设置。这是由 pyzzer 为当前用户设置的。

  • 为了让Python能够运行.zip存档,存档需要包含一个名为 __main__.py 的“主”模块。对于 pyzzer 创建的存档,您可以指定一个现有的 __main__.py 文件,指定仅单个源文件(然后将该文件写入存档作为 __main__.py),或者让 pyzzer 从模块:可调用的组合创建一个。除非存档包含一个顶层 __main__.py,否则无法使用 pyzzer 创建存档。

Windows支持

在Windows上,运行存档推荐的方式是安装Python Launcher for Windows,并使用它来运行存档。启动器处理POSIX风格的shebang行,并包含在Python 3.3及以后的版本中,但独立启动器更新更频繁。虽然Python 3.3启动器只能识别.py.pyc.pyo.pyw扩展名,但独立启动器还识别.pyz.pyzw扩展名,这些扩展名用于可运行的存档。

允许pyzzer提供将适当的本地Windows可执行文件添加到存档之前的能力,该可执行文件能够启动附加到其上的存档。这些启动器适用于32位和64位控制台和Windows应用程序(它们是在独立项目中开发的)。由于将这些可执行文件包含在pyzzer中会使它变大,因此这种支持以单独的下载形式提供(参见获取pyzzer)。

用法

用法信息提供了可用的选项

Usage: pyzzer [options] DIR_OR_FILE_OR_ARCHIVE [DIR_OR_FILE ...]

Convert Python source directories and files to runnable zip files. The
first argument can be an existing archive, which can be added to with
additional sources.

Options:
  -h, --help      show this help message and exit
  -s SHEBANG      Specify a shebang line to prepend to the archive, or the
                  path to an interpreter which can be used to determine the
                  shebang line to use. Defaults to "#! /usr/bin/env python"
                  on POSIX and to the value of sys.executable on Windows.
  -m MODULE:ATTR  Specify a callable which is the main entry point.
  -x REGEX        Specify regexes to exclude from the zip  (can specify more
                  than once).
  -o FILENAME     Specify the path of the file to write to. If not specified
                  and a source archive is given, it will be used; otherwise
                  the extension defaults to .pyz and the name defaults to
                  the first directory or file specified.
  -v              Provide information about progress.
  -i              Inspect an existing archive.
  -l LAUNCHER     Specify a Windows launcher to use (t32/w32/t64/w64).*
  -r              Recurse package directories.

* 仅在pyzzerw.pyz变体中可用(参见获取pyzzer)。

以下各节将更详细地讨论这些选项。

位置参数

位置参数是一个可选的现有存档,后跟目录和文件的列表。它们被处理如下

  • 如果第一个参数是存档,则除非使用-s来覆盖它,否则将保留其包含的任何shebang。存档的内容将添加到命令行其余部分指定的源。除非可用并使用-l,否则将保留存档/shebang之前的任何文件内容(例如,Windows上的本地可执行启动器)。

  • 如果参数是文件,则将其存档为顶级文件。

  • 如果参数是目录,则“pyzzer”根据它是否包含__init__.py来判断它是否为包。如果是,则将其视为Python包,并将其内容作为目录写入存档。默认情况下,不存档子包,除非指定-r,在这种情况下,将存档所有子包。如果目录不是包,则将其内容存档为顶级文件,并且不会递归到子目录中。

  • 如果添加了已存在于存档中的任何文件,将引发错误。

在添加到存档之前,目录中的文件将与使用-x指定的任何排除模式进行比较。如果匹配,则将其排除。此外,文件.hgignore.gitignore.bzrignore永远不会添加,并且目录.hg.git.bzr.svn永远不会递归到,即使指定了-r也是如此。任何未明确排除的文件都假定是包数据并包含在存档中。任何在命令行中指定的文件都假定是需要,并且不会与任何排除模式进行比较。

设置shebang行

您可以使用-s参数指定要使用的shebang行。如果参数值不以#!开头,它将被添加到指定的值之前——因此,您只需指定解释器的路径即可,因为这是所需的全部。

指定主程序

您可以在归档源文件中的某个地方指定一个现有函数,作为Python在运行归档时调用的主函数,方法是在模块:可调用参数中使用带有模块名:main等参数的-m参数,例如foo:mainfoo.bar:baz.main。当您这样做时,pyzzer将在这个函数周围包装一个Python源文件,并将其保存为归档中的顶级__main__.py文件。如果您这样做,则不能在您的源中指定__main__.py文件。如果您不指定-m,则必须指定您添加到归档中的源中的顶级__main__.py文件。

从归档中排除文件

您可以通过指定一个或多个正则表达式来排除与它们匹配的文件,这些文件不应包含在归档中。匹配使用search完成,这意味着您需要明确指定^$来锚定匹配。如果任何模式匹配文件名,则跳过该文件。请注意,模式将原样传递给正则表达式编译器,因此请小心转义模式中的任何特殊字符。

指定输出归档名称

您可以使用-o参数指定输出归档的名称。如果没有指定,并且传递了第一个参数作为归档,则将覆盖相同的归档。如果第一个参数不是归档,则其文件名用作输出归档名称,并且使用.pyz作为扩展名。

获取进度反馈

如果指定了-v选项,则pyzzer将在将文件写入归档时将其相对名称打印到控制台。

检查现有归档

如果指定了-i参数,则第一个位置参数应该是一个现有归档,后续的位置参数将被忽略。将打印现有归档的shebang行和内容。如果检测到原生可执行启动器,将在输出中指示。

递归子包

要递归地添加包中的子包,请指定-r参数。在递归时,假定包下面的所有目录都是子包或数据。

指定Windows启动器

尽管首选通过Windows Python启动器支持Windows,但pyzzerw.pyz归档允许将原生可执行文件添加到归档的前面。要使用它们,请使用-lt32w32t64w64之一,其中数字后缀表示是否使用32位或64位启动器,而初始字母被解释为t表示文本(即控制台)应用程序,w表示Windows应用程序。您还应该使用带有.exe扩展名的文件名指定-o

理论上,您应该能够从32位启动器启动32位或64位Python解释器。然而,提供了64位启动器以备不时之需。

请注意,为了达到最佳效果,您指定的任何shebang应与使用的启动器匹配(例如,使用w32w64的shebang将指定到pythonw.exe的路径)。否则,您可能看到虚假的控制台窗口(使用python.exe运行窗口应用程序)或没有任何输出(使用pythonw.exe运行控制台应用程序)。

这些启动器知道如何处理附加给它们的存档。当存档中的主程序运行时,sys.argv[0]将指定可执行存档的名称(something.exe)。

启动器具有嵌入式清单,这意味着您不会收到UAC提示。

在可运行存档中运行程序

您只需像运行任何正常Python脚本一样运行可运行存档,通过指定存档名称作为命令,并将任何要传递给脚本的参数作为命令的参数。

获取pyzzer

有两种可用的变体。下载pyzzer.pyz不包括对原生Windows启动器的支持,而下载pyzzerw.pyz则包括支持。请注意,这两个都是Windows上的控制台应用程序。

pyzzer是如何构建的

当然,pyzzer被用来构建包含自身的可执行存档。构建pyzzer.pyz的命令行是

python -m pyzzer -o pyzzer.pyz -x "exe|__main__|lau" -m pyzzer:main pyzzer

而构建pyzzerw.pyz的命令行是

python -m pyzzer -o pyzzerw.pyz -x "exe|__main__" -m pyzzer:main pyzzer

这些命令是在pyzzer项目目录(位于pyzzer包目录之上)中运行的。第一个构建不包括包含扩展Windows启动器功能并启用-l选项的pyzzer.launchers模块。

测试pyzzer

要运行pyzzer的测试套件,您需要克隆仓库,然后使用上述命令构建pyzzer.pyzpyzzerw.pyz。之后,您可以运行test_pyzzer.py脚本。测试通过使用subprocess运行来调用构建的文件,并使用各种命令行选项。

致谢

非常感谢Paul Moore对改进pyzzer的宝贵建议。

限制

  • 目前没有字节编译支持。

  • 不会检查指定的-m值是否实际上存在于源中。

  • 通过存在__init__.py__来识别包,因此不识别新式命名空间包(这些包没有这样的文件)。

  • 不支持替换现有存档中的文件。

欢迎补丁来帮助消除或减轻这些限制。

其他资源

  • PEP 441是倡导增加对.pyz.pyzw存档支持的PEP。

  • Daniel Holth的pyzaa包提供与pyzzer类似的功能。

  • 您不需要使用安装pyzzer(毕竟它是一个单文件的可执行文件)- 但如果您绝对需要,这里是在PyPI上的链接

变更日志

0.1.1

发布日期:2013-08-23。

  • 修复了Python 3.x中的TypeError

  • 当指定-l时,将默认的shebang使用Windows上的sys.executable,而不是POSIX(以及在Python启动器被使用的Windows)上使用的/usr/bin/env python

  • 如果输出扩展名为.exe且未指定启动器,则假设使用的是t32,除非是在64位Windows上(那里将假设使用的是t64)。

  • 如果只指定了一个源文件,且没有给出-m选项,并且归档文件不包含其他文件,那么该单个文件将使用名称__main__.py写入归档。

  • 增加了测试。

  • 调整了帮助信息。

  • 删除了未使用的代码。

  • 将变更日志移动到README并更新了文档。

0.1.0

发布日期:2013-08-19

  • 初始版本。

由以下支持